]> git.saurik.com Git - apple/icu.git/blobdiff - icuSources/test/intltest/dadrcoll.cpp
ICU-511.32.tar.gz
[apple/icu.git] / icuSources / test / intltest / dadrcoll.cpp
index 30c6540aff571602c2d2ac5dd7a7aae0a83b6658..62248096f3132740f7d71001890d640209c29b65 100644 (file)
@@ -1,6 +1,6 @@
 /********************************************************************
  * COPYRIGHT: 
- * Copyright (c) 1997-2003, International Business Machines Corporation and
+ * Copyright (c) 1997-2010, International Business Machines Corporation and
  * others. All Rights Reserved.
  ********************************************************************/
 
 
 #include "unicode/utypes.h"
 
-#if !UCONFIG_NO_COLLATION
+#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
@@ -39,15 +37,15 @@ DataDrivenCollatorTest::DataDrivenCollatorTest()
 status(U_ZERO_ERROR),
 sequences(status)
 {
-  TestLog testLog;
-
-  driver = TestDataModule::getTestDataModule("DataDrivenCollationTest", testLog, 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 */)
@@ -75,7 +73,7 @@ void DataDrivenCollatorTest::runIndexedTest( int32_t index, UBool exec, const ch
       name = "";
     }
   } else {
-    errln("collate/DataDrivenTest data not initialized!");
+    dataerrln("collate/DataDrivenTest data not initialized!");
     name = "";
   }
 
@@ -166,7 +164,7 @@ DataDrivenCollatorTest::processArguments(Collator *col, const UChar *start, int3
   }
 }
 
-void 
+void
 DataDrivenCollatorTest::processTest(TestData *testData) {
   Collator *col = NULL;
   const UChar *arguments = NULL;
@@ -198,14 +196,29 @@ DataDrivenCollatorTest::processTest(TestData *testData) {
         if(U_SUCCESS(status)) {
           logln("Testing collator for rules "+testSetting);
         } else {
-          errln("Unable to instantiate collator for rules "+testSetting);
+          errln("Unable to instantiate collator for rules "+testSetting+" - "+u_errorName(status));
           return;
         }
       } else {
         errln("No collator definition!");
+        return;
       }
     }
-    if(col != NULL) {
+    
+    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)) {
@@ -213,6 +226,9 @@ DataDrivenCollatorTest::processTest(TestData *testData) {
         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;
@@ -225,16 +241,22 @@ DataDrivenCollatorTest::processTest(TestData *testData) {
         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;