Index: icu46/source/test/intltest/dadrcoll.cpp |
=================================================================== |
--- icu46/source/test/intltest/dadrcoll.cpp (revision 0) |
+++ icu46/source/test/intltest/dadrcoll.cpp (revision 0) |
@@ -0,0 +1,291 @@ |
+/******************************************************************** |
+ * COPYRIGHT: |
+ * Copyright (c) 1997-2010, International Business Machines Corporation and |
+ * others. All Rights Reserved. |
+ ********************************************************************/ |
+ |
+/** |
+ * IntlTestCollator is the medium level test class for everything in the directory "collate". |
+ */ |
+ |
+/*********************************************************************** |
+* Modification history |
+* Date Name Description |
+* 02/14/2001 synwee Compare with cintltst and commented away tests |
+* that are not run. |
+***********************************************************************/ |
+ |
+#include "unicode/utypes.h" |
+ |
+#if !UCONFIG_NO_COLLATION && !UCONFIG_NO_FILE_IO |
+ |
+#include "unicode/uchar.h" |
+#include "unicode/tstdtmod.h" |
+#include "cstring.h" |
+#include "ucol_tok.h" |
+#include "tscoll.h" |
+#include "dadrcoll.h" |
+ |
+U_CDECL_BEGIN |
+static void U_CALLCONV deleteSeqElement(void *elem) { |
+ delete((SeqElement *)elem); |
+} |
+U_CDECL_END |
+ |
+DataDrivenCollatorTest::DataDrivenCollatorTest() |
+: seq(StringCharacterIterator("")), |
+status(U_ZERO_ERROR), |
+sequences(status) |
+{ |
+ driver = TestDataModule::getTestDataModule("DataDrivenCollationTest", *this, status); |
+ sequences.setDeleter(deleteSeqElement); |
+ UCA = (RuleBasedCollator*)Collator::createInstance("root", status); |
+} |
+ |
+DataDrivenCollatorTest::~DataDrivenCollatorTest() |
+{ |
+ delete driver; |
+ delete UCA; |
+} |
+ |
+void DataDrivenCollatorTest::runIndexedTest( int32_t index, UBool exec, const char* &name, char* /*par */) |
+{ |
+ if(driver != NULL) { |
+ if (exec) |
+ { |
+ logln("TestSuite Collator: "); |
+ } |
+ const DataMap *info = NULL; |
+ TestData *testData = driver->createTestData(index, status); |
+ if(U_SUCCESS(status)) { |
+ name = testData->getName(); |
+ if(testData->getInfo(info, status)) { |
+ log(info->getString("Description", status)); |
+ } |
+ if(exec) { |
+ log(name); |
+ logln("---"); |
+ logln(""); |
+ processTest(testData); |
+ } |
+ delete testData; |
+ } else { |
+ name = ""; |
+ } |
+ } else { |
+ dataerrln("collate/DataDrivenTest data not initialized!"); |
+ name = ""; |
+ } |
+ |
+ |
+} |
+ |
+UBool |
+DataDrivenCollatorTest::setTestSequence(const UnicodeString &setSequence, SeqElement &el) { |
+ seq.setText(setSequence); |
+ return getNextInSequence(el); |
+} |
+ |
+// Parses the sequence to be tested |
+UBool |
+DataDrivenCollatorTest::getNextInSequence(SeqElement &el) { |
+ el.source.truncate(0); |
+ UBool quoted = FALSE; |
+ UBool quotedsingle = FALSE; |
+ UChar32 currChar = 0; |
+ |
+ while(currChar != CharacterIterator::DONE) { |
+ currChar= seq.next32PostInc(); |
+ if(!quoted) { |
+ if(u_isWhitespace(currChar)) { |
+ continue; |
+ } |
+ switch(currChar) { |
+ case CharacterIterator::DONE: |
+ break; |
+ case 0x003C /* < */: |
+ el.relation = Collator::LESS; |
+ currChar = CharacterIterator::DONE; |
+ break; |
+ case 0x003D /* = */: |
+ el.relation = Collator::EQUAL; |
+ currChar = CharacterIterator::DONE; |
+ break; |
+ case 0x003E /* > */: |
+ el.relation = Collator::GREATER; |
+ currChar = CharacterIterator::DONE; |
+ break; |
+ case 0x0027 /* ' */: /* very basic quoting */ |
+ quoted = TRUE; |
+ quotedsingle = FALSE; |
+ break; |
+ case 0x005c /* \ */: /* single quote */ |
+ quoted = TRUE; |
+ quotedsingle = TRUE; |
+ break; |
+ default: |
+ el.source.append(currChar); |
+ } |
+ } else { |
+ if(currChar == CharacterIterator::DONE) { |
+ status = U_ILLEGAL_ARGUMENT_ERROR; |
+ errln("Quote in sequence not closed!"); |
+ return FALSE; |
+ } else if(currChar == 0x0027) { |
+ quoted = FALSE; |
+ } else { |
+ el.source.append(currChar); |
+ } |
+ if(quotedsingle) { |
+ quoted = FALSE; |
+ } |
+ } |
+ } |
+ return seq.hasNext(); |
+} |
+ |
+// Reads the options string and sets appropriate attributes in collator |
+void |
+DataDrivenCollatorTest::processArguments(Collator *col, const UChar *start, int32_t optLen) { |
+ const UChar *end = start+optLen; |
+ UColAttribute attrib; |
+ UColAttributeValue value; |
+ |
+ if(optLen == 0) { |
+ return; |
+ } |
+ |
+ start = ucol_tok_getNextArgument(start, end, &attrib, &value, &status); |
+ while(start != NULL) { |
+ if(U_SUCCESS(status)) { |
+ col->setAttribute(attrib, value, status); |
+ } |
+ start = ucol_tok_getNextArgument(start, end, &attrib, &value, &status); |
+ } |
+} |
+ |
+void |
+DataDrivenCollatorTest::processTest(TestData *testData) { |
+ Collator *col = NULL; |
+ const UChar *arguments = NULL; |
+ int32_t argLen = 0; |
+ const DataMap *settings = NULL; |
+ const DataMap *currentCase = NULL; |
+ UErrorCode intStatus = U_ZERO_ERROR; |
+ UnicodeString testSetting; |
+ while(testData->nextSettings(settings, status)) { |
+ intStatus = U_ZERO_ERROR; |
+ // try to get a locale |
+ testSetting = settings->getString("TestLocale", intStatus); |
+ if(U_SUCCESS(intStatus)) { |
+ char localeName[256]; |
+ testSetting.extract(0, testSetting.length(), localeName, ""); |
+ col = Collator::createInstance(localeName, status); |
+ if(U_SUCCESS(status)) { |
+ logln("Testing collator for locale "+testSetting); |
+ } else { |
+ errln("Unable to instantiate collator for locale "+testSetting); |
+ return; |
+ } |
+ } else { |
+ // if no locale, try from rules |
+ intStatus = U_ZERO_ERROR; |
+ testSetting = settings->getString("Rules", intStatus); |
+ if(U_SUCCESS(intStatus)) { |
+ col = new RuleBasedCollator(testSetting, status); |
+ if(U_SUCCESS(status)) { |
+ logln("Testing collator for rules "+testSetting); |
+ } else { |
+ errln("Unable to instantiate collator for rules "+testSetting+" - "+u_errorName(status)); |
+ return; |
+ } |
+ } else { |
+ errln("No collator definition!"); |
+ return; |
+ } |
+ } |
+ |
+ int32_t cloneSize = 0; |
+ uint8_t* cloneBuf = NULL; |
+ RuleBasedCollator* clone = NULL; |
+ if(col != NULL){ |
+ RuleBasedCollator* rbc = (RuleBasedCollator*)col; |
+ cloneSize = rbc->cloneBinary(NULL, 0, intStatus); |
+ intStatus = U_ZERO_ERROR; |
+ cloneBuf = (uint8_t*) malloc(cloneSize); |
+ cloneSize = rbc->cloneBinary(cloneBuf, cloneSize, intStatus); |
+ clone = new RuleBasedCollator(cloneBuf, cloneSize, UCA, intStatus); |
+ if(U_FAILURE(intStatus)){ |
+ errln("Could not clone the RuleBasedCollator. Error: %s", u_errorName(intStatus)); |
+ intStatus= U_ZERO_ERROR; |
+ } |
+ // get attributes |
+ testSetting = settings->getString("Arguments", intStatus); |
+ if(U_SUCCESS(intStatus)) { |
+ logln("Arguments: "+testSetting); |
+ argLen = testSetting.length(); |
+ arguments = testSetting.getBuffer(); |
+ processArguments(col, arguments, argLen); |
+ if(clone != NULL){ |
+ processArguments(clone, arguments, argLen); |
+ } |
+ if(U_FAILURE(status)) { |
+ errln("Couldn't process arguments"); |
+ break; |
+ } |
+ } else { |
+ intStatus = U_ZERO_ERROR; |
+ } |
+ // Start the processing |
+ while(testData->nextCase(currentCase, status)) { |
+ UnicodeString sequence = currentCase->getString("sequence", status); |
+ if(U_SUCCESS(status)) { |
+ processSequence(col, sequence); |
+ if(clone != NULL){ |
+ processSequence(clone, sequence); |
+ } |
+ } |
+ } |
+ } else { |
+ errln("Couldn't instantiate a collator!"); |
+ } |
+ delete clone; |
+ free(cloneBuf); |
+ delete col; |
+ col = NULL; |
+ } |
+} |
+ |
+ |
+void |
+DataDrivenCollatorTest::processSequence(Collator* col, const UnicodeString &sequence) { |
+ Collator::EComparisonResult relation = Collator::EQUAL; |
+ UBool hasNext; |
+ SeqElement *source = NULL; |
+ SeqElement *target = NULL; |
+ int32_t j = 0; |
+ |
+ sequences.removeAllElements(); |
+ |
+ target = new SeqElement(); |
+ |
+ setTestSequence(sequence, *target); |
+ sequences.addElement(target, status); |
+ |
+ do { |
+ relation = Collator::EQUAL; |
+ target = new SeqElement(); |
+ hasNext = getNextInSequence(*target); |
+ for(j = sequences.size(); j > 0; j--) { |
+ source = (SeqElement *)sequences.elementAt(j-1); |
+ if(relation == Collator::EQUAL && source->relation != Collator::EQUAL) { |
+ relation = source->relation; |
+ } |
+ doTest(col, source->source, target->source, relation); |
+ } |
+ sequences.addElement(target, status); |
+ source = target; |
+ } while(hasNext); |
+} |
+ |
+#endif /* #if !UCONFIG_NO_COLLATION */ |
Property changes on: icu46/source/test/intltest/dadrcoll.cpp |
___________________________________________________________________ |
Added: svn:eol-style |
+ LF |