1ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/**
2ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru *******************************************************************************
359d709d503bab6e2b61931737e662dd293b40578ccornelius * Copyright (C) 2001-2013, International Business Machines Corporation and
427f654740f2a26ad62a5c155af9199af9e69b889claireho * others. All Rights Reserved.
5ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru *******************************************************************************
6ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */
7ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius#include "utypeinfo.h"  // for 'typeid' to work
927f654740f2a26ad62a5c155af9199af9e69b889claireho
10ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/utypes.h"
11ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
12ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#if !UCONFIG_NO_SERVICE
13ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
14ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "icusvtst.h"
15ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "servloc.h"
16ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include <stdio.h>
17ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
18ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
19ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruclass MyListener : public EventListener {
20ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru};
21ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
22ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruclass WrongListener : public EventListener {
23ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru};
24ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
25ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruclass ICUNSubclass : public ICUNotifier {
26ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    public:
27ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UBool acceptsListener(const EventListener& /*l*/) const {
28ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return TRUE;
29ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        // return l instanceof MyListener;
30ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
31ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
32ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    virtual void notifyListener(EventListener& /*l*/) const {
33ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
34ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru};
35ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
36ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru// This factory does nothing
37ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruclass LKFSubclass0 : public LocaleKeyFactory {
38ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querupublic:
39ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        LKFSubclass0()
40ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                : LocaleKeyFactory(VISIBLE, "LKFSubclass0")
41ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        {
42ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
43ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru};
44ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
45ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruclass LKFSubclass : public LocaleKeyFactory {
46ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    Hashtable table;
47ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
48ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    public:
49ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    LKFSubclass(UBool visible)
50ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        : LocaleKeyFactory(visible ? VISIBLE : INVISIBLE, "LKFSubclass")
51ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
52ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        UErrorCode status = U_ZERO_ERROR;
53ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        table.put("en_US", this, status);
54ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
55ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
56ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    protected:
57ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    virtual const Hashtable* getSupportedIDs(UErrorCode &/*status*/) const {
58ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return &table;
59ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
60ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru};
61ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
62ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruclass Integer : public UObject {
63ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    public:
64ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const int32_t _val;
65ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
66ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    Integer(int32_t val) : _val(val) {
67ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
68ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
69ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    Integer(const Integer& rhs) : UObject(rhs), _val(rhs._val) {
70ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
71ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    virtual ~Integer() {
72ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
73ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
74ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    public:
75ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /**
76ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     * UObject boilerplate.
77ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     */
78ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    static UClassID getStaticClassID() {
79ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return (UClassID)&fgClassID;
80ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
81ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
82ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    virtual UClassID getDynamicClassID() const {
83ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return getStaticClassID();
84ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
85ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
86ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    virtual UBool operator==(const UObject& other) const
87ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
8827f654740f2a26ad62a5c155af9199af9e69b889claireho        return typeid(*this) == typeid(other) &&
89ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            _val == ((Integer&)other)._val;
90ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
91ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
92ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    public:
93ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    virtual UnicodeString& debug(UnicodeString& result) const {
94ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        debugClass(result);
95ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        result.append(" val: ");
96ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        result.append(_val);
97ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return result;
98ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
99ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
100ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    virtual UnicodeString& debugClass(UnicodeString& result) const {
101ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return result.append("Integer");
102ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
103ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
104ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    private:
105ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    static const char fgClassID;
106ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru};
107ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
108ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruconst char Integer::fgClassID = '\0';
109ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
110ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru// use locale keys
111ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruclass TestIntegerService : public ICUService {
112ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    public:
113ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ICUServiceKey* createKey(const UnicodeString* id, UErrorCode& status) const {
114ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return LocaleKey::createWithCanonicalFallback(id, NULL, status); // no fallback locale
115ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
116ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
117ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    virtual ICUServiceFactory* createSimpleFactory(UObject* obj, const UnicodeString& id, UBool visible, UErrorCode& status)
118ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
11927f654740f2a26ad62a5c155af9199af9e69b889claireho        Integer* i;
12027f654740f2a26ad62a5c155af9199af9e69b889claireho        if (U_SUCCESS(status) && obj && (i = dynamic_cast<Integer*>(obj)) != NULL) {
12127f654740f2a26ad62a5c155af9199af9e69b889claireho            return new SimpleFactory(i, id, visible);
122ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
123ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return NULL;
124ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
125ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
126ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    virtual UObject* cloneInstance(UObject* instance) const {
127ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return instance ? new Integer(*(Integer*)instance) : NULL;
128ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
129ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru};
130ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
131ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
132ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruICUServiceTest::ICUServiceTest() {
133ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
134ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
135ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruICUServiceTest::~ICUServiceTest() {
136ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
137ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
138ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruvoid
139ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruICUServiceTest::runIndexedTest(int32_t index, UBool exec, const char* &name,
140ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruchar* /*par*/)
141ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
142ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    switch (index) {
143ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        TESTCASE(0,testAPI_One);
144ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        TESTCASE(1,testAPI_Two);
145ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        TESTCASE(2,testRBF);
146ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        TESTCASE(3,testNotification);
147ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        TESTCASE(4,testLocale);
148ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        TESTCASE(5,testWrapFactory);
149ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        TESTCASE(6,testCoverage);
150ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    default: name = ""; break;
151ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
152ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
153ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
154ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruUnicodeString append(UnicodeString& result, const UObject* obj)
155ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
156ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    char buffer[128];
157ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (obj == NULL) {
158ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        result.append("NULL");
159ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    } else {
16027f654740f2a26ad62a5c155af9199af9e69b889claireho        const UnicodeString* s;
16127f654740f2a26ad62a5c155af9199af9e69b889claireho        const Locale* loc;
16227f654740f2a26ad62a5c155af9199af9e69b889claireho        const Integer* i;
16327f654740f2a26ad62a5c155af9199af9e69b889claireho        if ((s = dynamic_cast<const UnicodeString*>(obj)) != NULL) {
16427f654740f2a26ad62a5c155af9199af9e69b889claireho            result.append(*s);
16527f654740f2a26ad62a5c155af9199af9e69b889claireho        } else if ((loc = dynamic_cast<const Locale*>(obj)) != NULL) {
16627f654740f2a26ad62a5c155af9199af9e69b889claireho            result.append(loc->getName());
16727f654740f2a26ad62a5c155af9199af9e69b889claireho        } else if ((i = dynamic_cast<const Integer*>(obj)) != NULL) {
16827f654740f2a26ad62a5c155af9199af9e69b889claireho            sprintf(buffer, "%d", (int)i->_val);
169ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            result.append(buffer);
170ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        } else {
171ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            sprintf(buffer, "%p", (const void*)obj);
172ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            result.append(buffer);
173ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
174ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
175ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    return result;
176ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
177ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
178ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruUnicodeString&
179ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruICUServiceTest::lrmsg(UnicodeString& result, const UnicodeString& message, const UObject* lhs, const UObject* rhs) const
180ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
181ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    result.append(message);
182ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    result.append(" lhs: ");
183ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    append(result, lhs);
184ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    result.append(", rhs: ");
185ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    append(result, rhs);
186ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    return result;
187ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
188ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
189ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruvoid
190ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruICUServiceTest::confirmBoolean(const UnicodeString& message, UBool val)
191ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
192ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (val) {
193ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        logln(message);
194ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    } else {
195ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        errln(message);
196ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
197ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
198ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
199ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#if 0
200ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruvoid
201ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruICUServiceTest::confirmEqual(const UnicodeString& message, const UObject* lhs, const UObject* rhs)
202ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
203ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UBool equ = (lhs == NULL)
204ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        ? (rhs == NULL)
205ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        : (rhs != NULL && lhs->operator==(*rhs));
206ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
207ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UnicodeString temp;
208ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    lrmsg(temp, message, lhs, rhs);
209ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
210ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (equ) {
211ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        logln(temp);
212ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    } else {
213ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        errln(temp);
214ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
215ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
216ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#else
217ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruvoid
218ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruICUServiceTest::confirmEqual(const UnicodeString& message, const Integer* lhs, const Integer* rhs)
219ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
220ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UBool equ = (lhs == NULL)
221ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        ? (rhs == NULL)
222ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        : (rhs != NULL && lhs->operator==(*rhs));
223ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
224ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UnicodeString temp;
225ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    lrmsg(temp, message, lhs, rhs);
226ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
227ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (equ) {
228ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        logln(temp);
229ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    } else {
230ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        errln(temp);
231ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
232ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
233ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
234ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruvoid
235ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruICUServiceTest::confirmEqual(const UnicodeString& message, const UnicodeString* lhs, const UnicodeString* rhs)
236ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
237ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UBool equ = (lhs == NULL)
238ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        ? (rhs == NULL)
239ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        : (rhs != NULL && lhs->operator==(*rhs));
240ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
241ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UnicodeString temp;
242ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    lrmsg(temp, message, lhs, rhs);
243ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
244ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (equ) {
245ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        logln(temp);
246ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    } else {
247ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        errln(temp);
248ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
249ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
250ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
251ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruvoid
252ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruICUServiceTest::confirmEqual(const UnicodeString& message, const Locale* lhs, const Locale* rhs)
253ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
254ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UBool equ = (lhs == NULL)
255ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        ? (rhs == NULL)
256ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        : (rhs != NULL && lhs->operator==(*rhs));
257ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
258ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UnicodeString temp;
259ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    lrmsg(temp, message, lhs, rhs);
260ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
261ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (equ) {
262ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        logln(temp);
263ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    } else {
264ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        errln(temp);
265ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
266ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
267ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#endif
268ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
269ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru// use these for now
270ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruvoid
271ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruICUServiceTest::confirmStringsEqual(const UnicodeString& message, const UnicodeString& lhs, const UnicodeString& rhs)
272ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
273ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UBool equ = lhs == rhs;
274ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
275ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UnicodeString temp = message;
276ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    temp.append(" lhs: ");
277ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    temp.append(lhs);
278ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    temp.append(" rhs: ");
279ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    temp.append(rhs);
280ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
281ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (equ) {
282ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        logln(temp);
283ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    } else {
28485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        dataerrln(temp);
285ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
286ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
287ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
288ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
289ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruvoid
290ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruICUServiceTest::confirmIdentical(const UnicodeString& message, const UObject* lhs, const UObject *rhs)
291ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
292ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UnicodeString temp;
293ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    lrmsg(temp, message, lhs, rhs);
294ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (lhs == rhs) {
295ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        logln(temp);
296ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    } else {
297ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        errln(temp);
298ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
299ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
300ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
301ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruvoid
302ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruICUServiceTest::confirmIdentical(const UnicodeString& message, int32_t lhs, int32_t rhs)
303ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
304ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (lhs == rhs) {
305ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        logln(message + " lhs: " + lhs + " rhs: " + rhs);
306ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    } else {
307ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        errln(message + " lhs: " + lhs + " rhs: " + rhs);
308ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
309ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
310ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
311ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruvoid
312ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruICUServiceTest::msgstr(const UnicodeString& message, UObject* obj, UBool err)
313ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
314ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (obj) {
315ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UnicodeString* str = (UnicodeString*)obj;
316ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        logln(message + *str);
317ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        delete str;
318ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    } else if (err) {
319ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        errln("Error " + message + "string is NULL");
320ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
321ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
322ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
323ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruvoid
324ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruICUServiceTest::testAPI_One()
325ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
326ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    // create a service using locale keys,
327ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    TestIntegerService service;
328ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
329ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    // register an object with one locale,
330ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    // search for an object with a more specific locale
331ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    // should return the original object
332ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
333ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    Integer* singleton0 = new Integer(0);
334ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    service.registerInstance(singleton0, "en_US", status);
335ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
336ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        UErrorCode status = U_ZERO_ERROR;
337ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        Integer* result = (Integer*)service.get("en_US_FOO", status);
338ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        confirmEqual("1) en_US_FOO -> en_US", result, singleton0);
339ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        delete result;
340ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
341ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
342ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    // register a new object with the more specific locale
343ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    // search for an object with that locale
344ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    // should return the new object
345ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    Integer* singleton1 = new Integer(1);
346ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    service.registerInstance(singleton1, "en_US_FOO", status);
347ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
348ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        UErrorCode status = U_ZERO_ERROR;
349ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        Integer* result = (Integer*)service.get("en_US_FOO", status);
350ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        confirmEqual("2) en_US_FOO -> en_US_FOO", result, singleton1);
351ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        delete result;
352ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
353ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
354ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    // search for an object that falls back to the first registered locale
355ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
356ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        UErrorCode status = U_ZERO_ERROR;
357ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        Integer* result = (Integer*)service.get("en_US_BAR", status);
358ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        confirmEqual("3) en_US_BAR -> en_US", result, singleton0);
359ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        delete result;
360ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
361ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
362ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    // get a list of the factories, should be two
363ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
364ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        confirmIdentical("4) factory size", service.countFactories(), 2);
365ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
366ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
367ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    // register a new object with yet another locale
368ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    Integer* singleton2 = new Integer(2);
369ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    service.registerInstance(singleton2, "en", status);
370ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
371ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        confirmIdentical("5) factory size", service.countFactories(), 3);
372ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
373ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
374ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    // search for an object with the new locale
375ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    // stack of factories is now en, en_US_FOO, en_US
376ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    // search for en_US should still find en_US object
377ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
378ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        UErrorCode status = U_ZERO_ERROR;
379ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        Integer* result = (Integer*)service.get("en_US_BAR", status);
380ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        confirmEqual("6) en_US_BAR -> en_US", result, singleton0);
381ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        delete result;
382ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
383ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
384ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    // register a new object with an old id, should hide earlier factory using this id, but leave it there
385ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    Integer* singleton3 = new Integer(3);
386ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    URegistryKey s3key = service.registerInstance(singleton3, "en_US", status);
387ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
388ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        confirmIdentical("9) factory size", service.countFactories(), 4);
389ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
390ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
391ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    // should get data from that new factory
392ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
393ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        UErrorCode status = U_ZERO_ERROR;
394ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        Integer* result = (Integer*)service.get("en_US_BAR", status);
395ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        confirmEqual("10) en_US_BAR -> (3)", result, singleton3);
396ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        delete result;
397ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
398ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
399ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    // remove new factory
400ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    // should have fewer factories again
401ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    // singleton3 dead!
402ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
403ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        UErrorCode status = U_ZERO_ERROR;
404ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        service.unregister(s3key, status);
405ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        confirmIdentical("11) factory size", service.countFactories(), 3);
406ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
407ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
408ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    // should get original data again after remove factory
409ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
410ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        UErrorCode status = U_ZERO_ERROR;
411ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        Integer* result = (Integer*)service.get("en_US_BAR", status);
412ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        confirmEqual("12) en_US_BAR -> (3)", result, singleton0);
413ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        delete result;
414ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
415ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
416ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    // shouldn't find unregistered ids
417ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
418ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        UErrorCode status = U_ZERO_ERROR;
419ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        Integer* result = (Integer*)service.get("foo", status);
420ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        confirmIdentical("13) foo -> null", result, NULL);
421ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        delete result;
422ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
423ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
424ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    // should find non-canonical strings
425ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
426ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        UnicodeString resultID;
427ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        UErrorCode status = U_ZERO_ERROR;
428ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        Integer* result = (Integer*)service.get("EN_us_fOo", &resultID, status);
429ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        confirmEqual("14a) find-non-canonical", result, singleton1);
430ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        confirmStringsEqual("14b) find non-canonical", resultID, "en_US_FOO");
431ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        delete result;
432ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
433ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
434ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    // should be able to register non-canonical strings and get them canonicalized
435ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    Integer* singleton4 = new Integer(4);
436ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    service.registerInstance(singleton4, "eN_ca_dUde", status);
437ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
438ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        UnicodeString resultID;
439ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        UErrorCode status = U_ZERO_ERROR;
440ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        Integer* result = (Integer*)service.get("En_Ca_DuDe", &resultID, status);
441ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        confirmEqual("15a) find-non-canonical", result, singleton4);
442ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        confirmStringsEqual("15b) register non-canonical", resultID, "en_CA_DUDE");
443ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        delete result;
444ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
445ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
446ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    // should be able to register invisible factories, these will not
447ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    // be visible by default, but if you know the secret password you
448ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    // can still access these services...
449ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    Integer* singleton5 = new Integer(5);
450ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    service.registerInstance(singleton5, "en_US_BAR", FALSE, status);
451ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
452ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        UErrorCode status = U_ZERO_ERROR;
453ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        Integer* result = (Integer*)service.get("en_US_BAR", status);
454ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        confirmEqual("17) get invisible", result, singleton5);
455ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        delete result;
456ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
457ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
458ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    // should not be able to locate invisible services
459ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
460ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        UErrorCode status = U_ZERO_ERROR;
461103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UVector ids(uprv_deleteUObject, uhash_compareUnicodeString, status);
462ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        service.getVisibleIDs(ids, status);
463ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        UnicodeString target = "en_US_BAR";
464ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        confirmBoolean("18) find invisible", !ids.contains(&target));
465ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
466ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
467ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    // clear factory and caches
468ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    service.reset();
469ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    confirmBoolean("19) is default", service.isDefault());
470ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
471ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
472ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/*
473ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ******************************************************************
474ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */
475ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruclass TestStringSimpleKeyService : public ICUService {
476ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querupublic:
477ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
478ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        virtual ICUServiceFactory* createSimpleFactory(UObject* obj, const UnicodeString& id, UBool visible, UErrorCode& status)
479ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
480ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                // We could put this type check into ICUService itself, but we'd still
481ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                // have to implement cloneInstance.  Otherwise we could just tell the service
482ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                // what the object type is when we create it, and the default implementation
483ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                // could handle everything for us.  Phooey.
48427f654740f2a26ad62a5c155af9199af9e69b889claireho        if (obj && dynamic_cast<UnicodeString*>(obj) != NULL) {
485ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                        return ICUService::createSimpleFactory(obj, id, visible, status);
486ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
487ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return NULL;
488ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
489ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
490ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    virtual UObject* cloneInstance(UObject* instance) const {
491ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return instance ? new UnicodeString(*(UnicodeString*)instance) : NULL;
492ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
493ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru};
494ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
495ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruclass TestStringService : public ICUService {
496ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    public:
497ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ICUServiceKey* createKey(const UnicodeString* id, UErrorCode& status) const {
498ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return LocaleKey::createWithCanonicalFallback(id, NULL, status); // no fallback locale
499ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
500ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
501ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  virtual ICUServiceFactory* createSimpleFactory(UObject* obj, const UnicodeString& id, UBool visible, UErrorCode& /* status */)
502ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
50327f654740f2a26ad62a5c155af9199af9e69b889claireho        UnicodeString* s;
50427f654740f2a26ad62a5c155af9199af9e69b889claireho        if (obj && (s = dynamic_cast<UnicodeString*>(obj)) != NULL) {
50527f654740f2a26ad62a5c155af9199af9e69b889claireho            return new SimpleFactory(s, id, visible);
506ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
507ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return NULL;
508ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
509ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
510ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    virtual UObject* cloneInstance(UObject* instance) const {
511ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return instance ? new UnicodeString(*(UnicodeString*)instance) : NULL;
512ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
513ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru};
514ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
515ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru// this creates a string for any id, but doesn't report anything
516ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruclass AnonymousStringFactory : public ICUServiceFactory
517ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
518ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    public:
519ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    virtual UObject* create(const ICUServiceKey& key, const ICUService* /* service */, UErrorCode& /* status */) const {
520ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return new UnicodeString(key.getID());
521ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
522ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
523ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    virtual void updateVisibleIDs(Hashtable& /*result*/, UErrorCode& /*status*/) const {
524ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        // do nothing
525ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
526ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
527ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    virtual UnicodeString& getDisplayName(const UnicodeString& /*id*/, const Locale& /*locale*/, UnicodeString& result) const {
528ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        // do nothing
529ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return result;
530ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
531ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
532ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    static UClassID getStaticClassID() {
533ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return (UClassID)&fgClassID;
534ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
535ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
536ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    virtual UClassID getDynamicClassID() const {
537ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return getStaticClassID();
538ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
539ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
540ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    private:
541ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    static const char fgClassID;
542ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru};
543ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
544ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruconst char AnonymousStringFactory::fgClassID = '\0';
545ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
546ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruclass TestMultipleKeyStringFactory : public ICUServiceFactory {
547ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UErrorCode _status;
548ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UVector _ids;
549ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UnicodeString _factoryID;
550ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
551ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    public:
552ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    TestMultipleKeyStringFactory(const UnicodeString ids[], int32_t count, const UnicodeString& factoryID)
553ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        : _status(U_ZERO_ERROR)
554103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        , _ids(uprv_deleteUObject, uhash_compareUnicodeString, count, _status)
555ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        , _factoryID(factoryID + ": ")
556ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
557ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        for (int i = 0; i < count; ++i) {
558ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            _ids.addElement(new UnicodeString(ids[i]), _status);
559ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
560ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
561ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
562ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ~TestMultipleKeyStringFactory() {
563ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
564ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
565ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UObject* create(const ICUServiceKey& key, const ICUService* /* service */, UErrorCode& status) const {
566ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        if (U_FAILURE(status)) {
567ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return NULL;
568ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
569ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        UnicodeString temp;
570ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        key.currentID(temp);
571ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        if (U_SUCCESS(_status)) {
572ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        if (_ids.contains(&temp)) {
573ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                return new UnicodeString(_factoryID + temp);
574ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
575ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        } else {
576ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        status = _status;
577ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
578ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return NULL;
579ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
580ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
581ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    void updateVisibleIDs(Hashtable& result, UErrorCode& status) const {
582ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        if (U_SUCCESS(_status)) {
583ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            for (int32_t i = 0; i < _ids.size(); ++i) {
584ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                result.put(*(UnicodeString*)_ids[i], (void*)this, status);
585ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            }
586ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
587ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
588ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
589ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UnicodeString& getDisplayName(const UnicodeString& id, const Locale& locale, UnicodeString& result) const {
590ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        if (U_SUCCESS(_status) && _ids.contains((void*)&id)) {
591ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            char buffer[128];
592ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            UErrorCode status = U_ZERO_ERROR;
593ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            int32_t len = id.extract(buffer, sizeof(buffer), NULL, status);
594ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            if (U_SUCCESS(status)) {
595ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                if (len == sizeof(buffer)) {
596ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                    --len;
597ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                }
598ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                buffer[len] = 0;
599ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                Locale loc = Locale::createFromName(buffer);
600ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                loc.getDisplayName(locale, result);
601ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                return result;
602ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            }
603ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
604ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        result.setToBogus(); // shouldn't happen
605ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return result;
606ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
607ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
608ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    static UClassID getStaticClassID() {
609ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return (UClassID)&fgClassID;
610ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
611ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
612ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    virtual UClassID getDynamicClassID() const {
613ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return getStaticClassID();
614ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
615ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
616ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    private:
617ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    static const char fgClassID;
618ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru};
619ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
620ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruconst char TestMultipleKeyStringFactory::fgClassID = '\0';
621ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
622ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruvoid
623ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruICUServiceTest::testAPI_Two()
624ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
625ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
626ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    TestStringService service;
627ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    service.registerFactory(new AnonymousStringFactory(), status);
628ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
629ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    // anonymous factory will still handle the id
630ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
631ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        UErrorCode status = U_ZERO_ERROR;
632ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        const UnicodeString en_US = "en_US";
633ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        UnicodeString* result = (UnicodeString*)service.get(en_US, status);
634ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        confirmEqual("21) locale", result, &en_US);
635ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        delete result;
636ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
637ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
638ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    // still normalizes id
639ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
640ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        UErrorCode status = U_ZERO_ERROR;
641ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        const UnicodeString en_US_BAR = "en_US_BAR";
642ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        UnicodeString resultID;
643ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        UnicodeString* result = (UnicodeString*)service.get("EN_us_bar", &resultID, status);
644ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        confirmEqual("22) locale", &resultID, &en_US_BAR);
645ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        delete result;
646ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
647ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
648ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    // we can override for particular ids
649ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UnicodeString* singleton0 = new UnicodeString("Zero");
650ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    service.registerInstance(singleton0, "en_US_BAR", status);
651ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
652ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        UErrorCode status = U_ZERO_ERROR;
653ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        UnicodeString* result = (UnicodeString*)service.get("en_US_BAR", status);
654ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        confirmEqual("23) override super", result, singleton0);
655ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        delete result;
656ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
657ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
658ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    // empty service should not recognize anything
659ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    service.reset();
660ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
661ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        UErrorCode status = U_ZERO_ERROR;
662ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        UnicodeString* result = (UnicodeString*)service.get("en_US", status);
663ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        confirmIdentical("24) empty", result, NULL);
664ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
665ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
666ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    // create a custom multiple key factory
667ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
668ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        UnicodeString xids[] = {
669ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            "en_US_VALLEY_GIRL",
670ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            "en_US_VALLEY_BOY",
671ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            "en_US_SURFER_GAL",
672ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            "en_US_SURFER_DUDE"
673ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        };
674ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        int32_t count = sizeof(xids)/sizeof(UnicodeString);
675ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
676ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        ICUServiceFactory* f = new TestMultipleKeyStringFactory(xids, count, "Later");
677ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        service.registerFactory(f, status);
678ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
679ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
680ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    // iterate over the visual ids returned by the multiple factory
681ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
682ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        UErrorCode status = U_ZERO_ERROR;
683103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UVector ids(uprv_deleteUObject, uhash_compareUnicodeString, 0, status);
684ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        service.getVisibleIDs(ids, status);
685ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        for (int i = 0; i < ids.size(); ++i) {
686ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            const UnicodeString* id = (const UnicodeString*)ids[i];
687ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            UnicodeString* result = (UnicodeString*)service.get(*id, status);
688ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            if (result) {
689ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                logln("  " + *id + " --> " + *result);
690ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                delete result;
691ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            } else {
692ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                errln("could not find " + *id);
693ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            }
694ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
695ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        // four visible ids
696ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        confirmIdentical("25) visible ids", ids.size(), 4);
697ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
698ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
699ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    // iterate over the display names
700ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
701ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        UErrorCode status = U_ZERO_ERROR;
702ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        UVector names(status);
703ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        service.getDisplayNames(names, status);
704ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        for (int i = 0; i < names.size(); ++i) {
705ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            const StringPair* pair = (const StringPair*)names[i];
706ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            logln("  " + pair->displayName + " --> " + pair->id);
707ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
708ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        confirmIdentical("26) display names", names.size(), 4);
709ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
710ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
711ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    // no valid display name
712ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
713ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        UnicodeString name;
714ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        service.getDisplayName("en_US_VALLEY_GEEK", name);
715ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        confirmBoolean("27) get display name", name.isBogus());
716ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
717ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
718ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
719ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        UnicodeString name;
720ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        service.getDisplayName("en_US_SURFER_DUDE", name, Locale::getEnglish());
721ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        confirmStringsEqual("28) get display name", name, "English (United States, SURFER_DUDE)");
722ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
723ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
724ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    // register another multiple factory
725ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
726ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        UnicodeString xids[] = {
727ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            "en_US_SURFER",
728ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            "en_US_SURFER_GAL",
729ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            "en_US_SILICON",
730ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            "en_US_SILICON_GEEK",
731ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        };
732ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        int32_t count = sizeof(xids)/sizeof(UnicodeString);
733ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
734ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        ICUServiceFactory* f = new TestMultipleKeyStringFactory(xids, count, "Rad dude");
735ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        service.registerFactory(f, status);
736ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
737ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
738ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    // this time, we have seven display names
739ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    // Rad dude's surfer gal 'replaces' Later's surfer gal
740ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
741ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        UErrorCode status = U_ZERO_ERROR;
742ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        UVector names(status);
743ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        service.getDisplayNames(names, Locale("es"), status);
744ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        for (int i = 0; i < names.size(); ++i) {
745ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            const StringPair* pair = (const StringPair*)names[i];
746ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            logln("  " + pair->displayName + " --> " + pair->id);
747ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
74885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        confirmIdentical("29) display names", names.size(), 7);
749ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
750ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
751ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    // we should get the display name corresponding to the actual id
752ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    // returned by the id we used.
753ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
754ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        UErrorCode status = U_ZERO_ERROR;
755ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        UnicodeString actualID;
756ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        UnicodeString id = "en_us_surfer_gal";
757ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        UnicodeString* gal = (UnicodeString*)service.get(id, &actualID, status);
758ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        if (gal != NULL) {
759ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            UnicodeString displayName;
760ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            logln("actual id: " + actualID);
761ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            service.getDisplayName(actualID, displayName, Locale::getEnglish());
762ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            logln("found actual: " + *gal + " with display name: " + displayName);
763ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            confirmBoolean("30) found display name for actual", !displayName.isBogus());
764ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
765ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            service.getDisplayName(id, displayName, Locale::getEnglish());
766ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            logln("found actual: " + *gal + " with display name: " + displayName);
767ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            confirmBoolean("31) found display name for query", displayName.isBogus());
768ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
769ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            delete gal;
770ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        } else {
771ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            errln("30) service could not find entry for " + id);
772ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
773ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
774ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
775ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    // this should be handled by the 'dude' factory, since it overrides en_US_SURFER.
776ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
777ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        UErrorCode status = U_ZERO_ERROR;
778ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        UnicodeString actualID;
779ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        UnicodeString id = "en_US_SURFER_BOZO";
780ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        UnicodeString* bozo = (UnicodeString*)service.get(id, &actualID, status);
781ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        if (bozo != NULL) {
782ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            UnicodeString displayName;
783ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            service.getDisplayName(actualID, displayName, Locale::getEnglish());
784ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            logln("found actual: " + *bozo + " with display name: " + displayName);
785ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            confirmBoolean("32) found display name for actual", !displayName.isBogus());
786ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
787ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            service.getDisplayName(id, displayName, Locale::getEnglish());
788ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            logln("found actual: " + *bozo + " with display name: " + displayName);
789ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            confirmBoolean("33) found display name for query", displayName.isBogus());
790ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
791ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            delete bozo;
792ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        } else {
793ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            errln("32) service could not find entry for " + id);
794ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
795ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
796ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
797ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    // certainly not default...
798ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
799ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        confirmBoolean("34) is default ", !service.isDefault());
800ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
801ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
802ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
803ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        UErrorCode status = U_ZERO_ERROR;
804103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UVector ids(uprv_deleteUObject, uhash_compareUnicodeString, 0, status);
805ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        service.getVisibleIDs(ids, status);
806ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        for (int i = 0; i < ids.size(); ++i) {
807ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            const UnicodeString* id = (const UnicodeString*)ids[i];
808ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            msgstr(*id + "? ", service.get(*id, status));
809ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
810ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
811ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        logstr("valleygirl?  ", service.get("en_US_VALLEY_GIRL", status));
812ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        logstr("valleyboy?   ", service.get("en_US_VALLEY_BOY", status));
813ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        logstr("valleydude?  ", service.get("en_US_VALLEY_DUDE", status));
814ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        logstr("surfergirl?  ", service.get("en_US_SURFER_GIRL", status));
815ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
816ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
817ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
818ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
819ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruclass CalifornioLanguageFactory : public ICUResourceBundleFactory
820ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
821ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    public:
822ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    static const char* californio; // = "en_US_CA";
823ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    static const char* valley; // = californio ## "_VALLEY";
824ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    static const char* surfer; // = californio ## "_SURFER";
825ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    static const char* geek; // = californio ## "_GEEK";
826ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    static Hashtable* supportedIDs; // = NULL;
827ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
828ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    static void cleanup(void) {
829ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      delete supportedIDs;
830ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      supportedIDs = NULL;
831ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
832ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
833ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const Hashtable* getSupportedIDs(UErrorCode& status) const
834ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
835ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        if (supportedIDs == NULL) {
836ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            Hashtable* table = new Hashtable();
837ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            table->put(UnicodeString(californio), (void*)table, status);
838ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            table->put(UnicodeString(valley), (void*)table, status);
839ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            table->put(UnicodeString(surfer), (void*)table, status);
840ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            table->put(UnicodeString(geek), (void*)table, status);
841ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
842ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            // not necessarily atomic, but this is a test...
843ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            supportedIDs = table;
844ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
845ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return supportedIDs;
846ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
847ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
848ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UnicodeString& getDisplayName(const UnicodeString& id, const Locale& locale, UnicodeString& result) const
849ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
850ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        UnicodeString prefix = "";
851ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        UnicodeString suffix = "";
852ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        UnicodeString ls = locale.getName();
853ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        if (LocaleUtility::isFallbackOf(californio, ls)) {
854ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            if (!ls.caseCompare(valley, 0)) {
855ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                prefix = "Like, you know, it's so totally ";
856ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            } else if (!ls.caseCompare(surfer, 0)) {
857ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                prefix = "Dude, it's ";
858ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            } else if (!ls.caseCompare(geek, 0)) {
859ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                prefix = "I'd estimate it is approximately ";
860ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            } else {
861ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                prefix = "Huh?  Maybe ";
862ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            }
863ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
864ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        if (LocaleUtility::isFallbackOf(californio, id)) {
865ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            if (!id.caseCompare(valley, 0)) {
866ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                suffix = "like the Valley, you know?  Let's go to the mall!";
867ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            } else if (!id.caseCompare(surfer, 0)) {
868ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                suffix = "time to hit those gnarly waves, Dude!!!";
869ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            } else if (!id.caseCompare(geek, 0)) {
870ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                suffix = "all systems go.  T-Minus 9, 8, 7...";
871ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            } else {
872ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                suffix = "No Habla Englais";
873ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            }
874ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        } else {
875ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            suffix = ICUResourceBundleFactory::getDisplayName(id, locale, result);
876ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
877ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
878ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        result = prefix + suffix;
879ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return result;
880ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
881ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru};
882ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
883ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruconst char* CalifornioLanguageFactory::californio = "en_US_CA";
884ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruconst char* CalifornioLanguageFactory::valley = "en_US_CA_VALLEY";
885ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruconst char* CalifornioLanguageFactory::surfer = "en_US_CA_SURFER";
886ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruconst char* CalifornioLanguageFactory::geek = "en_US_CA_GEEK";
887ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruHashtable* CalifornioLanguageFactory::supportedIDs = NULL;
888ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
889ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruvoid
890ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruICUServiceTest::testRBF()
891ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
892ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    // resource bundle factory.
893ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
894ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    TestStringService service;
895ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    service.registerFactory(new ICUResourceBundleFactory(), status);
896ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
897ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    // list all of the resources
898ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
899ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        UErrorCode status = U_ZERO_ERROR;
900103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UVector ids(uprv_deleteUObject, uhash_compareUnicodeString, 0, status);
901ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        service.getVisibleIDs(ids, status);
902ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        logln("all visible ids:");
903ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        for (int i = 0; i < ids.size(); ++i) {
904ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            const UnicodeString* id = (const UnicodeString*)ids[i];
905ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            logln(*id);
906ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
907ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
908ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
909ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    // get all the display names of these resources
910ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    // this should be fast since the display names were cached.
911ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
912ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        UErrorCode status = U_ZERO_ERROR;
913ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        UVector names(status);
914ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        service.getDisplayNames(names, Locale::getGermany(), status);
915ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        logln("service display names for de_DE");
916ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        for (int i = 0; i < names.size(); ++i) {
917ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            const StringPair* pair = (const StringPair*)names[i];
918ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            logln("  " + pair->displayName + " --> " + pair->id);
919ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
920ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
921ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
922ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    service.registerFactory(new CalifornioLanguageFactory(), status);
923ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
924ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    // get all the display names of these resources
925ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
926ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        logln("californio language factory:");
927ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        const char* idNames[] = {
928ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            CalifornioLanguageFactory::californio,
929ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            CalifornioLanguageFactory::valley,
930ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            CalifornioLanguageFactory::surfer,
931ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            CalifornioLanguageFactory::geek,
932ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        };
933ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        int32_t count = sizeof(idNames)/sizeof(idNames[0]);
934ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
935ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        for (int i = 0; i < count; ++i) {
936ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            logln(UnicodeString("\n  --- ") + idNames[i] + " ---");
937ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            {
938ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                UErrorCode status = U_ZERO_ERROR;
939ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                UVector names(status);
940ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                service.getDisplayNames(names, idNames[i], status);
941ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                for (int i = 0; i < names.size(); ++i) {
942ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                    const StringPair* pair = (const StringPair*)names[i];
943ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                    logln("  " + pair->displayName + " --> " + pair->id);
944ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                }
945ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            }
946ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
947ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
948ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    CalifornioLanguageFactory::cleanup();
949ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
950ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
951ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruclass SimpleListener : public ServiceListener {
952ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ICUServiceTest* _test;
953ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UnicodeString _name;
954ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
955ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    public:
95659d709d503bab6e2b61931737e662dd293b40578ccornelius    SimpleListener(ICUServiceTest* test, const UnicodeString& name) : _test(test), _name(name) {}
957ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
958ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    virtual void serviceChanged(const ICUService& service) const {
959ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        UnicodeString serviceName = "listener ";
960ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        serviceName.append(_name);
961ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        serviceName.append(" n++");
962ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        serviceName.append(" service changed: " );
963ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        service.getName(serviceName);
964ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        _test->logln(serviceName);
965ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
966ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru};
967ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
968ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruvoid
969ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruICUServiceTest::testNotification()
970ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
971ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    SimpleListener one(this, "one");
972ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    SimpleListener two(this, "two");
973ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
974ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        UErrorCode status = U_ZERO_ERROR;
975ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
976ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        logln("simple registration notification");
977ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        TestStringService ls;
978ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        ls.addListener(&one, status);
979ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        ls.addListener(&two, status);
980ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
981ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        logln("registering foo... ");
982ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        ls.registerInstance(new UnicodeString("Foo"), "en_FOO", status);
983ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        logln("registering bar... ");
984ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        ls.registerInstance(new UnicodeString("Bar"), "en_BAR", status);
985ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        logln("getting foo...");
986ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        UnicodeString* result = (UnicodeString*)ls.get("en_FOO", status);
987ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        logln(*result);
988ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        delete result;
989ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
990ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        logln("removing listener 2...");
991ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        ls.removeListener(&two, status);
992ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        logln("registering baz...");
993ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        ls.registerInstance(new UnicodeString("Baz"), "en_BAZ", status);
994ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        logln("removing listener 1");
995ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        ls.removeListener(&one, status);
996ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        logln("registering burp...");
997ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        ls.registerInstance(new UnicodeString("Burp"), "en_BURP", status);
998ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
999ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        // should only get one notification even if register multiple times
1000ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        logln("... trying multiple registration");
1001ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        ls.addListener(&one, status);
1002ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        ls.addListener(&one, status);
1003ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        ls.addListener(&one, status);
1004ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        ls.addListener(&two, status);
1005ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        ls.registerInstance(new UnicodeString("Foo"), "en_FOO", status);
1006ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        logln("... registered foo");
1007ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
1008ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#if 0
1009ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    // same thread, so we can't callback within notification, unlike Java
1010ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ServiceListener l3 = new ServiceListener() {
1011ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruprivate int n;
1012ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querupublic void serviceChanged(ICUService s) {
1013ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    logln("listener 3 report " + n++ + " service changed...");
1014ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (s.get("en_BOINK") == null) { // don't recurse on ourselves!!!
1015ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        logln("registering boink...");
1016ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        s.registerInstance("boink", "en_BOINK");
1017ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
1018ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
1019ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    };
1020ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ls.addListener(l3);
1021ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    logln("registering boo...");
1022ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ls.registerInstance("Boo", "en_BOO");
1023ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#endif
1024ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1025ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    logln("...done");
1026ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
1027ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1028ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruclass TestStringLocaleService : public ICULocaleService {
1029ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    public:
1030ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    virtual UObject* cloneInstance(UObject* instance) const {
1031ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return instance ? new UnicodeString(*(UnicodeString*)instance) : NULL;
1032ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
1033ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru};
1034ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1035ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruvoid ICUServiceTest::testLocale() {
1036ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
1037ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    TestStringLocaleService service;
1038ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1039ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UnicodeString* root = new UnicodeString("root");
1040ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UnicodeString* german = new UnicodeString("german");
1041ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UnicodeString* germany = new UnicodeString("german_Germany");
1042ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UnicodeString* japanese = new UnicodeString("japanese");
1043ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UnicodeString* japan = new UnicodeString("japanese_Japan");
1044ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1045ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    service.registerInstance(root, "", status);
1046ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    service.registerInstance(german, "de", status);
1047ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    service.registerInstance(germany, Locale::getGermany(), status);
1048ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    service.registerInstance(japanese, (UnicodeString)"ja", TRUE, status);
1049ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    service.registerInstance(japan, Locale::getJapan(), status);
1050ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1051ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
1052ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        UErrorCode status = U_ZERO_ERROR;
1053ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        UnicodeString* target = (UnicodeString*)service.get("de_US", status);
1054ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        confirmEqual("test de_US", german, target);
1055ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        delete target;
1056ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
1057ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1058ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
1059ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        UErrorCode status = U_ZERO_ERROR;
1060ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        UnicodeString* target = (UnicodeString*)service.get("de_US", LocaleKey::KIND_ANY, status);
1061ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        confirmEqual("test de_US 2", german, target);
1062ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        delete target;
1063ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
1064ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1065ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
1066ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        UErrorCode status = U_ZERO_ERROR;
1067ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        UnicodeString* target = (UnicodeString*)service.get("de_US", 1234, status);
1068ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        confirmEqual("test de_US 3", german, target);
1069ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        delete target;
1070ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
1071ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1072ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
1073ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        UErrorCode status = U_ZERO_ERROR;
1074ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        Locale actualReturn;
1075ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        UnicodeString* target = (UnicodeString*)service.get("de_US", &actualReturn, status);
1076ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        confirmEqual("test de_US 5", german, target);
1077ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        confirmEqual("test de_US 6", &actualReturn, &Locale::getGerman());
1078ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        delete target;
1079ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
1080ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1081ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
1082ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        UErrorCode status = U_ZERO_ERROR;
1083ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        Locale actualReturn;
1084ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        UnicodeString* target = (UnicodeString*)service.get("de_US", LocaleKey::KIND_ANY, &actualReturn, status);
1085ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        confirmEqual("test de_US 7", &actualReturn, &Locale::getGerman());
1086ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        delete target;
1087ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
1088ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1089ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
1090ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        UErrorCode status = U_ZERO_ERROR;
1091ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        Locale actualReturn;
1092ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        UnicodeString* target = (UnicodeString*)service.get("de_US", 1234, &actualReturn, status);
1093ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        confirmEqual("test de_US 8", german, target);
1094ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        confirmEqual("test de_US 9", &actualReturn, &Locale::getGerman());
1095ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        delete target;
1096ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
1097ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1098ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UnicodeString* one = new UnicodeString("one/de_US");
1099ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UnicodeString* two = new UnicodeString("two/de_US");
1100ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1101ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    service.registerInstance(one, Locale("de_US"), 1, status);
1102ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    service.registerInstance(two, Locale("de_US"), 2, status);
1103ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1104ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
1105ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        UErrorCode status = U_ZERO_ERROR;
1106ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        UnicodeString* target = (UnicodeString*)service.get("de_US", 1, status);
1107ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        confirmEqual("test de_US kind 1", one, target);
1108ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        delete target;
1109ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
1110ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1111ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
1112ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        UErrorCode status = U_ZERO_ERROR;
1113ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        UnicodeString* target = (UnicodeString*)service.get("de_US", 2, status);
1114ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        confirmEqual("test de_US kind 2", two, target);
1115ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        delete target;
1116ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
1117ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1118ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
1119ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        UErrorCode status = U_ZERO_ERROR;
1120ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        UnicodeString* target = (UnicodeString*)service.get("de_US", status);
1121ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        confirmEqual("test de_US kind 3", german, target);
1122ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        delete target;
1123ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
1124ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1125ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
1126ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        UErrorCode status = U_ZERO_ERROR;
1127ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        UnicodeString english = "en";
1128ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        Locale localeResult;
1129ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        UnicodeString result;
1130ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        LocaleKey* lkey = LocaleKey::createWithCanonicalFallback(&english, NULL, 1234, status);
1131ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        logln("lkey prefix: " + lkey->prefix(result));
1132ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        result.remove();
1133ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        logln("lkey descriptor: " + lkey->currentDescriptor(result));
1134ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        result.remove();
1135ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        logln(UnicodeString("lkey current locale: ") + lkey->currentLocale(localeResult).getName());
1136ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        result.remove();
1137ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1138ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        lkey->fallback();
1139ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        logln("lkey descriptor 2: " + lkey->currentDescriptor(result));
1140ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        result.remove();
1141ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1142ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        lkey->fallback();
1143ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        logln("lkey descriptor 3: " + lkey->currentDescriptor(result));
1144ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        result.remove();
1145ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        delete lkey; // tentatively weiv
1146ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
1147ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1148ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
1149ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        UErrorCode status = U_ZERO_ERROR;
1150ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        UnicodeString* target = (UnicodeString*)service.get("za_PPP", status);
1151ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        confirmEqual("test zappp", root, target);
1152ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        delete target;
1153ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
1154ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1155ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    Locale loc = Locale::getDefault();
1156ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    Locale::setDefault(Locale::getJapanese(), status);
1157ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
1158ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        UErrorCode status = U_ZERO_ERROR;
1159ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        UnicodeString* target = (UnicodeString*)service.get("za_PPP", status);
1160ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        confirmEqual("test with ja locale", japanese, target);
1161ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        delete target;
1162ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
1163ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1164ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
1165ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        UErrorCode status = U_ZERO_ERROR;
1166103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UVector ids(uprv_deleteUObject, uhash_compareUnicodeString, 0, status);
1167ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        service.getVisibleIDs(ids, status);
1168ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        logln("all visible ids:");
1169ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        for (int i = 0; i < ids.size(); ++i) {
1170ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            const UnicodeString* id = (const UnicodeString*)ids[i];
1171ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            logln(*id);
1172ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
1173ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
1174ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1175ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    Locale::setDefault(loc, status);
1176ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
1177ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        UErrorCode status = U_ZERO_ERROR;
1178103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UVector ids(uprv_deleteUObject, uhash_compareUnicodeString, 0, status);
1179ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        service.getVisibleIDs(ids, status);
1180ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        logln("all visible ids:");
1181ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        for (int i = 0; i < ids.size(); ++i) {
1182ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            const UnicodeString* id = (const UnicodeString*)ids[i];
1183ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            logln(*id);
1184ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
1185ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
1186ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1187ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
1188ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        UErrorCode status = U_ZERO_ERROR;
1189ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        UnicodeString* target = (UnicodeString*)service.get("za_PPP", status);
1190ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        confirmEqual("test with en locale", root, target);
1191ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        delete target;
1192ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
1193ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1194ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
1195ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        UErrorCode status = U_ZERO_ERROR;
1196ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        StringEnumeration* locales = service.getAvailableLocales();
1197ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        if (locales) {
1198ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            confirmIdentical("test available locales", locales->count(status), 6);
1199ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            logln("locales: ");
1200ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            {
1201ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                const char* p;
1202ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                while ((p = locales->next(NULL, status))) {
1203ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                    logln(p);
1204ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                }
1205ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            }
1206ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            logln(" ");
1207ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            delete locales;
1208ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        } else {
1209ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            errln("could not create available locales");
1210ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
1211ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
1212ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
1213ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1214ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruclass WrapFactory : public ICUServiceFactory {
1215ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    public:
1216ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    static const UnicodeString& getGreetingID() {
1217ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      if (greetingID == NULL) {
1218ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    greetingID = new UnicodeString("greeting");
1219ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      }
1220ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      return *greetingID;
1221ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
1222ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1223ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  static void cleanup() {
1224ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    delete greetingID;
1225ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    greetingID = NULL;
1226ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  }
1227ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1228ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UObject* create(const ICUServiceKey& key, const ICUService* service, UErrorCode& status) const {
1229ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        if (U_SUCCESS(status)) {
1230ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            UnicodeString temp;
1231ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            if (key.currentID(temp).compare(getGreetingID()) == 0) {
1232ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                UnicodeString* previous = (UnicodeString*)service->getKey((ICUServiceKey&)key, NULL, this, status);
1233ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                if (previous) {
1234ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                    previous->insert(0, "A different greeting: \"");
1235ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                    previous->append("\"");
1236ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                    return previous;
1237ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                }
1238ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            }
1239ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
1240ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return NULL;
1241ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
1242ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1243ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    void updateVisibleIDs(Hashtable& result, UErrorCode& status) const {
1244ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        if (U_SUCCESS(status)) {
1245ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            result.put("greeting", (void*)this, status);
1246ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
1247ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
1248ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1249ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UnicodeString& getDisplayName(const UnicodeString& id, const Locale& /* locale */, UnicodeString& result) const {
1250ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        result.append("wrap '");
1251ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        result.append(id);
1252ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        result.append("'");
1253ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return result;
1254ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
1255ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1256ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /**
1257ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     * UObject boilerplate.
1258ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     */
1259ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    static UClassID getStaticClassID() {
1260ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return (UClassID)&fgClassID;
1261ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
1262ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1263ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    virtual UClassID getDynamicClassID() const {
1264ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return getStaticClassID();
1265ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
1266ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1267ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    private:
1268ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    static const char fgClassID;
1269ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    static UnicodeString* greetingID;
1270ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru};
1271ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1272ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruUnicodeString* WrapFactory::greetingID = NULL;
1273ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruconst char WrapFactory::fgClassID = '\0';
1274ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1275ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruvoid
1276ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruICUServiceTest::testWrapFactory()
1277ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
1278ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UnicodeString* greeting = new UnicodeString("Hello There");
1279ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UnicodeString greetingID = "greeting";
1280ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
1281ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    TestStringService service;
1282ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    service.registerInstance(greeting, greetingID, status);
1283ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1284ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
1285ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        UErrorCode status = U_ZERO_ERROR;
1286ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        UnicodeString* result = (UnicodeString*)service.get(greetingID, status);
1287ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        if (result) {
1288ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            logln("test one: " + *result);
1289ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            delete result;
1290ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
1291ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
1292ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1293ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    service.registerFactory(new WrapFactory(), status);
1294ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
1295ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        UErrorCode status = U_ZERO_ERROR;
1296ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        UnicodeString* result = (UnicodeString*)service.get(greetingID, status);
1297ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        UnicodeString target = "A different greeting: \"Hello There\"";
1298ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        confirmEqual("wrap test: ", result, &target);
1299ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        delete result;
1300ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
1301ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1302ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    WrapFactory::cleanup();
1303ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
1304ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1305ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  // misc coverage tests
1306ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruvoid ICUServiceTest::testCoverage()
1307ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
1308ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  // ICUServiceKey
1309ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  {
1310ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UnicodeString temp;
1311ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ICUServiceKey key("foobar");
1312ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    logln("ID: " + key.getID());
1313ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    logln("canonicalID: " + key.canonicalID(temp));
1314ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    logln("currentID: " + key.currentID(temp.remove()));
1315ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    logln("has fallback: " + UnicodeString(key.fallback() ? "true" : "false"));
1316ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1317ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (key.getDynamicClassID() != ICUServiceKey::getStaticClassID()) {
1318ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      errln("service key rtt failed.");
1319ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
1320ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  }
1321ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1322ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  // SimpleFactory
1323ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  {
1324ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
1325ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1326ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UnicodeString* obj = new UnicodeString("An Object");
1327ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    SimpleFactory* sf = new SimpleFactory(obj, "object");
1328ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1329ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UnicodeString temp;
1330ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    logln(sf->getDisplayName("object", Locale::getDefault(), temp));
1331ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1332ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (sf->getDynamicClassID() != SimpleFactory::getStaticClassID()) {
1333ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      errln("simple factory rtti failed.");
1334ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
1335ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1336ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    // ICUService
1337ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        {
1338ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                TestStringService service;
1339ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                service.registerFactory(sf,     status);
1340ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1341ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                {
1342ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                        UnicodeString* result   = (UnicodeString*)service.get("object", status);
1343ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                        if (result) {
1344ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                                logln("object is: "     + *result);
1345ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                                delete result;
1346ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                        }       else {
1347ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                                errln("could not get object");
1348ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                        }
1349ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                }
1350ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
1351ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  }
1352ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1353ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  // ICUServiceKey
1354ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  {
1355ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      UErrorCode status = U_ZERO_ERROR;
1356ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru          UnicodeString* howdy = new UnicodeString("Howdy");
1357ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1358ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru          TestStringSimpleKeyService service;
1359ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru          service.registerInstance(howdy, "Greetings", status);
1360ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru          {
1361ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                  UnicodeString* result = (UnicodeString*)service.get("Greetings",      status);
1362ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                  if (result) {
1363ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                          logln("object is: "   + *result);
1364ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                          delete result;
1365ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                  }     else {
1366ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                          errln("could not get object");
1367ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                  }
1368ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru          }
1369ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1370103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius      UVector ids(uprv_deleteUObject, uhash_compareUnicodeString, status);
1371ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru          // yuck, this is awkward to use.  All because we pass null in an overload.
1372ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru          // TODO: change this.
1373ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru          UnicodeString str("Greet");
1374ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      service.getVisibleIDs(ids, &str, status);
1375ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      confirmIdentical("no fallback of greet", ids.size(), 0);
1376ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  }
1377ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1378ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  // ICULocaleService
1379ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1380ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  // LocaleKey
1381ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  {
1382ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UnicodeString primary("en_US");
1383ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UnicodeString fallback("ja_JP");
1384ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
1385ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    LocaleKey* key = LocaleKey::createWithCanonicalFallback(&primary, &fallback, status);
1386ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1387ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (key->getDynamicClassID() != LocaleKey::getStaticClassID()) {
1388ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      errln("localekey rtti error");
1389ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
1390ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1391ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (!key->isFallbackOf("en_US_FOOBAR")) {
1392ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      errln("localekey should be fallback for en_US_FOOBAR");
1393ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
1394ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (!key->isFallbackOf("en_US")) {
1395ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      errln("localekey should be fallback for en_US");
1396ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
1397ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (key->isFallbackOf("en")) {
1398ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      errln("localekey should not be fallback for en");
1399ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
1400ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1401ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    do {
1402ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      Locale loc;
1403ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      logln(UnicodeString("current locale: ") + key->currentLocale(loc).getName());
1404ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      logln(UnicodeString("canonical locale: ") + key->canonicalLocale(loc).getName());
1405ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      logln(UnicodeString("is fallback of en: ") + (key->isFallbackOf("en") ? "true" : " false"));
1406ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    } while (key->fallback());
1407ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    delete key;
1408ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1409ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    // LocaleKeyFactory
1410ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    key = LocaleKey::createWithCanonicalFallback(&primary, &fallback, status);
1411ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1412ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UnicodeString result;
1413ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    LKFSubclass lkf(TRUE); // empty
1414ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    Hashtable table;
1415ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1416ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UObject *obj = lkf.create(*key, NULL, status);
1417ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    logln("obj: " + UnicodeString(obj ? "obj" : "null"));
1418ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    logln(lkf.getDisplayName("en_US", Locale::getDefault(), result));
1419ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    lkf.updateVisibleIDs(table, status);
1420ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    delete obj;
1421ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (table.count() != 1) {
1422ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      errln("visible IDs does not contain en_US");
1423ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
1424ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1425ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    LKFSubclass invisibleLKF(FALSE);
1426ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    obj = lkf.create(*key, NULL, status);
1427ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    logln("obj: " + UnicodeString(obj ? "obj" : "null"));
1428ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    logln(invisibleLKF.getDisplayName("en_US", Locale::getDefault(), result.remove()));
1429ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    invisibleLKF.updateVisibleIDs(table, status);
1430ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (table.count() != 0) {
1431ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      errln("visible IDs contains en_US");
1432ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
1433ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    delete obj;
1434ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    delete key;
1435ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1436ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        key = LocaleKey::createWithCanonicalFallback(&primary, &fallback, 123, status);
1437ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        if (U_SUCCESS(status)) {
1438ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                UnicodeString str;
1439ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                key->currentDescriptor(str);
1440ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                key->parsePrefix(str);
1441ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                if (str != "123") {
1442ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                        errln("did not get expected prefix");
1443ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                }
1444ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                delete key;
1445ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
1446ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1447ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        // coverage, getSupportedIDs is either overridden or the calling method is
1448ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        LKFSubclass0 lkFactory;
1449ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        Hashtable table0;
1450ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        lkFactory.updateVisibleIDs(table0, status);
1451ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        if (table0.count() != 0) {
1452ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                errln("LKF returned non-empty hashtable");
1453ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
1454ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1455ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1456ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        // ResourceBundleFactory
1457ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    key = LocaleKey::createWithCanonicalFallback(&primary, &fallback, status);
1458ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        ICUResourceBundleFactory rbf;
1459ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        UObject* icurb = rbf.create(*key, NULL, status);
1460ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        if (icurb != NULL) {
1461ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                logln("got resource bundle for key");
1462ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                delete icurb;
1463ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
1464ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        delete key;
1465ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  }
1466ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1467ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru #if 0
1468ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru // ICUNotifier
1469ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  ICUNotifier nf = new ICUNSubclass();
1470ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  try {
1471ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    nf.addListener(null);
1472ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    errln("added null listener");
1473ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  }
1474ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  catch (NullPointerException e) {
1475ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    logln(e.getMessage());
1476ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  }
1477ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  catch (Exception e) {
1478ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    errln("got wrong exception");
1479ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  }
1480ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1481ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  try {
1482ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    nf.addListener(new WrongListener());
1483ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    errln("added wrong listener");
1484ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  }
1485ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  catch (InternalError e) {
1486ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    logln(e.getMessage());
1487ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  }
1488ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  catch (Exception e) {
1489ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    errln("got wrong exception");
1490ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  }
1491ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1492ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  try {
1493ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    nf.removeListener(null);
1494ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    errln("removed null listener");
1495ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  }
1496ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  catch (NullPointerException e) {
1497ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    logln(e.getMessage());
1498ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  }
1499ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  catch (Exception e) {
1500ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    errln("got wrong exception");
1501ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  }
1502ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1503ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  nf.removeListener(new MyListener());
1504ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  nf.notifyChanged();
1505ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  nf.addListener(new MyListener());
1506ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  nf.removeListener(new MyListener());
1507ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#endif
1508ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
1509ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1510ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1511ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/* !UCONFIG_NO_SERVICE */
1512ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#endif
1513ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1514ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1515