]> git.saurik.com Git - apple/icu.git/blobdiff - icuSources/test/intltest/icusvtst.cpp
ICU-511.27.tar.gz
[apple/icu.git] / icuSources / test / intltest / icusvtst.cpp
index 1a25027a799ccc93484d81628998b7047c3f2cbf..8de38703cf7aba86ccc5d917462871d5fe22313d 100644 (file)
@@ -1,18 +1,18 @@
 /**
  *******************************************************************************
 /**
  *******************************************************************************
- * Copyright (C) 2001-2004, International Business Machines Corporation and    *
- * others. All Rights Reserved.                                                *
- *******************************************************************************
- *
+ * Copyright (C) 2001-2012, International Business Machines Corporation and
+ * others. All Rights Reserved.
  *******************************************************************************
  */
 
  *******************************************************************************
  */
 
+#include "utypeinfo.h"  // for 'typeid' to work
+
 #include "unicode/utypes.h"
 
 #if !UCONFIG_NO_SERVICE
 
 #include "icusvtst.h"
 #include "unicode/utypes.h"
 
 #if !UCONFIG_NO_SERVICE
 
 #include "icusvtst.h"
-#include "iculserv.h"
+#include "servloc.h"
 #include <stdio.h>
 
 
 #include <stdio.h>
 
 
@@ -24,15 +24,24 @@ class WrongListener : public EventListener {
 
 class ICUNSubclass : public ICUNotifier {
     public:
 
 class ICUNSubclass : public ICUNotifier {
     public:
-    UBool acceptsListener(const EventListener& l) const {
+    UBool acceptsListener(const EventListener& /*l*/) const {
         return TRUE;
         // return l instanceof MyListener;
     }
 
         return TRUE;
         // return l instanceof MyListener;
     }
 
-    virtual void notifyListener(EventListener& l) const {
+    virtual void notifyListener(EventListener& /*l*/) const {
     }
 };
 
     }
 };
 
+// This factory does nothing
+class LKFSubclass0 : public LocaleKeyFactory {
+public:
+        LKFSubclass0()
+                : LocaleKeyFactory(VISIBLE, "LKFSubclass0")
+        {
+        }
+};
+
 class LKFSubclass : public LocaleKeyFactory {
     Hashtable table;
 
 class LKFSubclass : public LocaleKeyFactory {
     Hashtable table;
 
@@ -62,22 +71,22 @@ class Integer : public UObject {
     virtual ~Integer() {
     }
 
     virtual ~Integer() {
     }
 
-    virtual UBool operator==(const UObject& other) const 
-    {
-        return other.getDynamicClassID() == getStaticClassID() &&
-            _val == ((Integer&)other)._val;
-    }
-
     public:
     /**
      * UObject boilerplate.
      */
     public:
     /**
      * UObject boilerplate.
      */
+    static UClassID getStaticClassID() { 
+        return (UClassID)&fgClassID;
+    }
+
     virtual UClassID getDynamicClassID() const {
         return getStaticClassID();
     }
 
     virtual UClassID getDynamicClassID() const {
         return getStaticClassID();
     }
 
-    static UClassID getStaticClassID() { 
-        return (UClassID)&fgClassID;
+    virtual UBool operator==(const UObject& other) const 
+    {
+        return typeid(*this) == typeid(other) &&
+            _val == ((Integer&)other)._val;
     }
 
     public:
     }
 
     public:
@@ -107,8 +116,9 @@ class TestIntegerService : public ICUService {
 
     virtual ICUServiceFactory* createSimpleFactory(UObject* obj, const UnicodeString& id, UBool visible, UErrorCode& status) 
     {
 
     virtual ICUServiceFactory* createSimpleFactory(UObject* obj, const UnicodeString& id, UBool visible, UErrorCode& status) 
     {
-        if (U_SUCCESS(status) && obj && obj->getDynamicClassID() == Integer::getStaticClassID()) {
-            return new SimpleFactory((Integer*)obj, id, visible);
+        Integer* i;
+        if (U_SUCCESS(status) && obj && (i = dynamic_cast<Integer*>(obj)) != NULL) {
+            return new SimpleFactory(i, id, visible);
         }
         return NULL;
     }
         }
         return NULL;
     }
@@ -147,13 +157,15 @@ UnicodeString append(UnicodeString& result, const UObject* obj)
     if (obj == NULL) {
         result.append("NULL");
     } else {
     if (obj == NULL) {
         result.append("NULL");
     } else {
-        UClassID id = obj->getDynamicClassID();
-        if (id == UnicodeString::getStaticClassID()) {
-            result.append(*(UnicodeString*)obj);
-        } else if (id == Locale::getStaticClassID()) {
-            result.append(((Locale*)obj)->getName());
-        } else if (id == Integer::getStaticClassID()) {
-            sprintf(buffer, "%d", (int)((Integer*)obj)->_val);
+        const UnicodeString* s;
+        const Locale* loc;
+        const Integer* i;
+        if ((s = dynamic_cast<const UnicodeString*>(obj)) != NULL) {
+            result.append(*s);
+        } else if ((loc = dynamic_cast<const Locale*>(obj)) != NULL) {
+            result.append(loc->getName());
+        } else if ((i = dynamic_cast<const Integer*>(obj)) != NULL) {
+            sprintf(buffer, "%d", (int)i->_val);
             result.append(buffer);
         } else {
             sprintf(buffer, "%p", (const void*)obj);
             result.append(buffer);
         } else {
             sprintf(buffer, "%p", (const void*)obj);
@@ -269,7 +281,7 @@ ICUServiceTest::confirmStringsEqual(const UnicodeString& message, const UnicodeS
     if (equ) {
         logln(temp);
     } else {
     if (equ) {
         logln(temp);
     } else {
-        errln(temp);
+        dataerrln(temp);
     }
 }
 
     }
 }
 
@@ -446,7 +458,7 @@ ICUServiceTest::testAPI_One()
     // should not be able to locate invisible services
     {
         UErrorCode status = U_ZERO_ERROR;
     // should not be able to locate invisible services
     {
         UErrorCode status = U_ZERO_ERROR;
-        UVector ids(uhash_deleteUnicodeString, uhash_compareUnicodeString, status);
+        UVector ids(uprv_deleteUObject, uhash_compareUnicodeString, status);
         service.getVisibleIDs(ids, status);
         UnicodeString target = "en_US_BAR";
         confirmBoolean("18) find invisible", !ids.contains(&target));
         service.getVisibleIDs(ids, status);
         UnicodeString target = "en_US_BAR";
         confirmBoolean("18) find invisible", !ids.contains(&target));
@@ -460,6 +472,25 @@ ICUServiceTest::testAPI_One()
 /*
  ******************************************************************
  */
 /*
  ******************************************************************
  */
+class TestStringSimpleKeyService : public ICUService {
+public:
+        virtual ICUServiceFactory* createSimpleFactory(UObject* obj, const UnicodeString& id, UBool visible, UErrorCode& status) 
+    {
+                // We could put this type check into ICUService itself, but we'd still
+                // have to implement cloneInstance.  Otherwise we could just tell the service
+                // what the object type is when we create it, and the default implementation
+                // could handle everything for us.  Phooey.
+        if (obj && dynamic_cast<UnicodeString*>(obj) != NULL) {
+                        return ICUService::createSimpleFactory(obj, id, visible, status);
+        }
+        return NULL;
+    }
+
+    virtual UObject* cloneInstance(UObject* instance) const {
+        return instance ? new UnicodeString(*(UnicodeString*)instance) : NULL;
+    }
+};
 
 class TestStringService : public ICUService {
     public:
 
 class TestStringService : public ICUService {
     public:
@@ -469,8 +500,9 @@ class TestStringService : public ICUService {
 
   virtual ICUServiceFactory* createSimpleFactory(UObject* obj, const UnicodeString& id, UBool visible, UErrorCode& /* status */) 
     {
 
   virtual ICUServiceFactory* createSimpleFactory(UObject* obj, const UnicodeString& id, UBool visible, UErrorCode& /* status */) 
     {
-        if (obj && obj->getDynamicClassID() == UnicodeString::getStaticClassID()) {
-            return new SimpleFactory((UnicodeString*)obj, id, visible);
+        UnicodeString* s;
+        if (obj && (s = dynamic_cast<UnicodeString*>(obj)) != NULL) {
+            return new SimpleFactory(s, id, visible);
         }
         return NULL;
     }
         }
         return NULL;
     }
@@ -497,14 +529,14 @@ class AnonymousStringFactory : public ICUServiceFactory
         return result;
     }
 
         return result;
     }
 
-    virtual UClassID getDynamicClassID() const {
-        return getStaticClassID();
-    }
-
     static UClassID getStaticClassID() {
         return (UClassID)&fgClassID;
     }
 
     static UClassID getStaticClassID() {
         return (UClassID)&fgClassID;
     }
 
+    virtual UClassID getDynamicClassID() const {
+        return getStaticClassID();
+    }
+
     private:
     static const char fgClassID;
 };
     private:
     static const char fgClassID;
 };
@@ -519,7 +551,7 @@ class TestMultipleKeyStringFactory : public ICUServiceFactory {
     public:
     TestMultipleKeyStringFactory(const UnicodeString ids[], int32_t count, const UnicodeString& factoryID)
         : _status(U_ZERO_ERROR)
     public:
     TestMultipleKeyStringFactory(const UnicodeString ids[], int32_t count, const UnicodeString& factoryID)
         : _status(U_ZERO_ERROR)
-        , _ids(uhash_deleteUnicodeString, uhash_compareUnicodeString, count, _status)
+        , _ids(uprv_deleteUObject, uhash_compareUnicodeString, count, _status)
         , _factoryID(factoryID + ": ") 
     {
         for (int i = 0; i < count; ++i) {
         , _factoryID(factoryID + ": ") 
     {
         for (int i = 0; i < count; ++i) {
@@ -573,14 +605,14 @@ class TestMultipleKeyStringFactory : public ICUServiceFactory {
         return result;
     }
 
         return result;
     }
 
-    virtual UClassID getDynamicClassID() const {
-        return getStaticClassID();
-    }
-
     static UClassID getStaticClassID() {
         return (UClassID)&fgClassID;
     }
 
     static UClassID getStaticClassID() {
         return (UClassID)&fgClassID;
     }
 
+    virtual UClassID getDynamicClassID() const {
+        return getStaticClassID();
+    }
+
     private:
     static const char fgClassID;
 };
     private:
     static const char fgClassID;
 };
@@ -648,7 +680,7 @@ ICUServiceTest::testAPI_Two()
     // iterate over the visual ids returned by the multiple factory
     {
         UErrorCode status = U_ZERO_ERROR;
     // iterate over the visual ids returned by the multiple factory
     {
         UErrorCode status = U_ZERO_ERROR;
-        UVector ids(uhash_deleteUnicodeString, uhash_compareUnicodeString, 0, status);
+        UVector ids(uprv_deleteUObject, uhash_compareUnicodeString, 0, status);
         service.getVisibleIDs(ids, status);
         for (int i = 0; i < ids.size(); ++i) {
             const UnicodeString* id = (const UnicodeString*)ids[i];
         service.getVisibleIDs(ids, status);
         for (int i = 0; i < ids.size(); ++i) {
             const UnicodeString* id = (const UnicodeString*)ids[i];
@@ -667,8 +699,8 @@ ICUServiceTest::testAPI_Two()
     // iterate over the display names
     {
         UErrorCode status = U_ZERO_ERROR;
     // iterate over the display names
     {
         UErrorCode status = U_ZERO_ERROR;
-        UVector names(userv_deleteStringPair, NULL, status);
-        service.getDisplayNames(names, Locale::getGerman(), status);
+        UVector names(status);
+        service.getDisplayNames(names, status);
         for (int i = 0; i < names.size(); ++i) {
             const StringPair* pair = (const StringPair*)names[i];
             logln("  " + pair->displayName + " --> " + pair->id);
         for (int i = 0; i < names.size(); ++i) {
             const StringPair* pair = (const StringPair*)names[i];
             logln("  " + pair->displayName + " --> " + pair->id);
@@ -707,13 +739,13 @@ ICUServiceTest::testAPI_Two()
     // Rad dude's surfer gal 'replaces' Later's surfer gal
     {
         UErrorCode status = U_ZERO_ERROR;
     // Rad dude's surfer gal 'replaces' Later's surfer gal
     {
         UErrorCode status = U_ZERO_ERROR;
-        UVector names(userv_deleteStringPair, NULL, status);
+        UVector names(status);
         service.getDisplayNames(names, Locale("es"), status);
         for (int i = 0; i < names.size(); ++i) {
             const StringPair* pair = (const StringPair*)names[i];
             logln("  " + pair->displayName + " --> " + pair->id);
         }
         service.getDisplayNames(names, Locale("es"), status);
         for (int i = 0; i < names.size(); ++i) {
             const StringPair* pair = (const StringPair*)names[i];
             logln("  " + pair->displayName + " --> " + pair->id);
         }
-        confirmIdentical("26) display names", names.size(), 7);
+        confirmIdentical("29) display names", names.size(), 7);
     }
 
     // we should get the display name corresponding to the actual id
     }
 
     // we should get the display name corresponding to the actual id
@@ -769,7 +801,7 @@ ICUServiceTest::testAPI_Two()
 
     {
         UErrorCode status = U_ZERO_ERROR;
 
     {
         UErrorCode status = U_ZERO_ERROR;
-        UVector ids(uhash_deleteUnicodeString, uhash_compareUnicodeString, 0, status);
+        UVector ids(uprv_deleteUObject, uhash_compareUnicodeString, 0, status);
         service.getVisibleIDs(ids, status);
         for (int i = 0; i < ids.size(); ++i) {
             const UnicodeString* id = (const UnicodeString*)ids[i];
         service.getVisibleIDs(ids, status);
         for (int i = 0; i < ids.size(); ++i) {
             const UnicodeString* id = (const UnicodeString*)ids[i];
@@ -865,7 +897,7 @@ ICUServiceTest::testRBF()
     // list all of the resources 
     {
         UErrorCode status = U_ZERO_ERROR;
     // list all of the resources 
     {
         UErrorCode status = U_ZERO_ERROR;
-        UVector ids(uhash_deleteUnicodeString, uhash_compareUnicodeString, 0, status);
+        UVector ids(uprv_deleteUObject, uhash_compareUnicodeString, 0, status);
         service.getVisibleIDs(ids, status);
         logln("all visible ids:");
         for (int i = 0; i < ids.size(); ++i) {
         service.getVisibleIDs(ids, status);
         logln("all visible ids:");
         for (int i = 0; i < ids.size(); ++i) {
@@ -878,7 +910,7 @@ ICUServiceTest::testRBF()
     // this should be fast since the display names were cached.
     {
         UErrorCode status = U_ZERO_ERROR;
     // this should be fast since the display names were cached.
     {
         UErrorCode status = U_ZERO_ERROR;
-        UVector names(userv_deleteStringPair, NULL, status);
+        UVector names(status);
         service.getDisplayNames(names, Locale::getGermany(), status);
         logln("service display names for de_DE");
         for (int i = 0; i < names.size(); ++i) {
         service.getDisplayNames(names, Locale::getGermany(), status);
         logln("service display names for de_DE");
         for (int i = 0; i < names.size(); ++i) {
@@ -904,7 +936,7 @@ ICUServiceTest::testRBF()
             logln(UnicodeString("\n  --- ") + idNames[i] + " ---");
             {
                 UErrorCode status = U_ZERO_ERROR;
             logln(UnicodeString("\n  --- ") + idNames[i] + " ---");
             {
                 UErrorCode status = U_ZERO_ERROR;
-                UVector names(userv_deleteStringPair, NULL, status);
+                UVector names(status);
                 service.getDisplayNames(names, idNames[i], status);
                 for (int i = 0; i < names.size(); ++i) {
                     const StringPair* pair = (const StringPair*)names[i];
                 service.getDisplayNames(names, idNames[i], status);
                 for (int i = 0; i < names.size(); ++i) {
                     const StringPair* pair = (const StringPair*)names[i];
@@ -1014,7 +1046,7 @@ void ICUServiceTest::testLocale() {
     service.registerInstance(root, "", status);
     service.registerInstance(german, "de", status);
     service.registerInstance(germany, Locale::getGermany(), status);
     service.registerInstance(root, "", status);
     service.registerInstance(german, "de", status);
     service.registerInstance(germany, Locale::getGermany(), status);
-    service.registerInstance(japanese, "ja", status);
+    service.registerInstance(japanese, (UnicodeString)"ja", TRUE, status);
     service.registerInstance(japan, Locale::getJapan(), status);
 
     {
     service.registerInstance(japan, Locale::getJapan(), status);
 
     {
@@ -1132,7 +1164,7 @@ void ICUServiceTest::testLocale() {
 
     {
         UErrorCode status = U_ZERO_ERROR;
 
     {
         UErrorCode status = U_ZERO_ERROR;
-        UVector ids(uhash_deleteUnicodeString, uhash_compareUnicodeString, 0, status);
+        UVector ids(uprv_deleteUObject, uhash_compareUnicodeString, 0, status);
         service.getVisibleIDs(ids, status);
         logln("all visible ids:");
         for (int i = 0; i < ids.size(); ++i) {
         service.getVisibleIDs(ids, status);
         logln("all visible ids:");
         for (int i = 0; i < ids.size(); ++i) {
@@ -1144,7 +1176,7 @@ void ICUServiceTest::testLocale() {
     Locale::setDefault(loc, status);
     {
         UErrorCode status = U_ZERO_ERROR;
     Locale::setDefault(loc, status);
     {
         UErrorCode status = U_ZERO_ERROR;
-        UVector ids(uhash_deleteUnicodeString, uhash_compareUnicodeString, 0, status);
+        UVector ids(uprv_deleteUObject, uhash_compareUnicodeString, 0, status);
         service.getVisibleIDs(ids, status);
         logln("all visible ids:");
         for (int i = 0; i < ids.size(); ++i) {
         service.getVisibleIDs(ids, status);
         logln("all visible ids:");
         for (int i = 0; i < ids.size(); ++i) {
@@ -1225,14 +1257,14 @@ class WrapFactory : public ICUServiceFactory {
     /**
      * UObject boilerplate.
      */
     /**
      * UObject boilerplate.
      */
-    virtual UClassID getDynamicClassID() const {
-        return getStaticClassID();
-    }
-
     static UClassID getStaticClassID() { 
         return (UClassID)&fgClassID;
     }
 
     static UClassID getStaticClassID() { 
         return (UClassID)&fgClassID;
     }
 
+    virtual UClassID getDynamicClassID() const {
+        return getStaticClassID();
+    }
+
     private:
     static const char fgClassID;
     static UnicodeString* greetingID;
     private:
     static const char fgClassID;
     static UnicodeString* greetingID;
@@ -1303,18 +1335,45 @@ void ICUServiceTest::testCoverage()
     }
 
     // ICUService
     }
 
     // ICUService
-    TestStringService service;
-    service.registerFactory(sf, status);
-
-    {
-      UnicodeString* result = (UnicodeString*)service.get("object", status);
-      if (result) {
-    logln("object is: " + *result);
-    delete result;
-      } else {
-    errln("could not get object");
-      }
-    }
+        {
+                TestStringService service;
+                service.registerFactory(sf,     status);
+
+                {
+                        UnicodeString* result   = (UnicodeString*)service.get("object", status);
+                        if (result) {
+                                logln("object is: "     + *result);
+                                delete result;
+                        }       else {
+                                errln("could not get object");
+                        }
+                }
+        }
+  }
+  
+  // ICUServiceKey
+  {
+      UErrorCode status = U_ZERO_ERROR;
+          UnicodeString* howdy = new UnicodeString("Howdy");
+
+          TestStringSimpleKeyService service;
+          service.registerInstance(howdy, "Greetings", status);
+          {
+                  UnicodeString* result = (UnicodeString*)service.get("Greetings",      status);
+                  if (result) {
+                          logln("object is: "   + *result);
+                          delete result;
+                  }     else {
+                          errln("could not get object");
+                  }
+          }
+
+      UVector ids(uprv_deleteUObject, uhash_compareUnicodeString, status);
+          // yuck, this is awkward to use.  All because we pass null in an overload.
+          // TODO: change this.
+          UnicodeString str("Greet");
+      service.getVisibleIDs(ids, &str, status);
+      confirmIdentical("no fallback of greet", ids.size(), 0);
   }
 
   // ICULocaleService
   }
 
   // ICULocaleService
@@ -1374,15 +1433,40 @@ void ICUServiceTest::testCoverage()
     }
     delete obj;
     delete key;
     }
     delete obj;
     delete key;
-  }
 
 
+        key = LocaleKey::createWithCanonicalFallback(&primary, &fallback, 123, status);
+        if (U_SUCCESS(status)) {
+                UnicodeString str;
+                key->currentDescriptor(str);
+                key->parsePrefix(str);
+                if (str != "123") {
+                        errln("did not get expected prefix");
+                }
+                delete key;
+        }
+
+        // coverage, getSupportedIDs is either overridden or the calling method is
+        LKFSubclass0 lkFactory;
+        Hashtable table0;
+        lkFactory.updateVisibleIDs(table0, status);
+        if (table0.count() != 0) {
+                errln("LKF returned non-empty hashtable");
+        }
 
 
-#if 0
-  // ResourceBundleFactory
-  ICUResourceBundleFactory rbf = new ICUResourceBundleFactory();
-  logln("RB: " + rbf.create(lkey, null));
 
 
-  // ICUNotifier
+        // ResourceBundleFactory
+    key = LocaleKey::createWithCanonicalFallback(&primary, &fallback, status);
+        ICUResourceBundleFactory rbf;
+        UObject* icurb = rbf.create(*key, NULL, status);
+        if (icurb != NULL) {
+                logln("got resource bundle for key");
+                delete icurb;
+        }
+        delete key;
+  }
+
+ #if 0
+ // ICUNotifier
   ICUNotifier nf = new ICUNSubclass();
   try {
     nf.addListener(null);
   ICUNotifier nf = new ICUNSubclass();
   try {
     nf.addListener(null);