1b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/***********************************************************************
2b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * COPYRIGHT:
327f654740f2a26ad62a5c155af9199af9e69b889claireho * Copyright (c) 1997-2010, International Business Machines Corporation
4b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * and others. All Rights Reserved.
5b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ***********************************************************************/
6b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
7b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/utypes.h"
8b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
9b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_FORMATTING
10b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
11b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "nmfmapts.h"
12b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
13b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/numfmt.h"
14b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/decimfmt.h"
15b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/locid.h"
16b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/unum.h"
17b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/strenum.h"
18b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
19b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// This is an API test, not a unit test.  It doesn't test very many cases, and doesn't
20b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// try to test the full functionality.  It just calls each function in the class and
21b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// verifies that it works on a basic level.
22b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
23b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid IntlTestNumberFormatAPI::runIndexedTest( int32_t index, UBool exec, const char* &name, char* /*par*/ )
24b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
25b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (exec) logln("TestSuite NumberFormatAPI");
26b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    switch (index) {
27b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        case 0: name = "NumberFormat API test";
28b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                if (exec) {
29b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    logln("NumberFormat API test---"); logln("");
30b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    UErrorCode status = U_ZERO_ERROR;
31b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    Locale saveLocale;
32b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    Locale::setDefault(Locale::getEnglish(), status);
33b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    if(U_FAILURE(status)) {
34b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        errln("ERROR: Could not set default locale, test may not give correct results");
35b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    }
36b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    testAPI(/* par */);
37b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    Locale::setDefault(saveLocale, status);
38b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                }
39b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                break;
40b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        case 1: name = "NumberFormatRegistration";
41b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                if (exec) {
42b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    logln("NumberFormat Registration test---"); logln("");
43b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    UErrorCode status = U_ZERO_ERROR;
44b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    Locale saveLocale;
45b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    Locale::setDefault(Locale::getEnglish(), status);
46b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    if(U_FAILURE(status)) {
47b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        errln("ERROR: Could not set default locale, test may not give correct results");
48b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    }
49b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    testRegistration();
50b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    Locale::setDefault(saveLocale, status);
51b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                }
52b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                break;
53b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        default: name = ""; break;
54b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
55b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
56b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
57b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
58b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * This test does round-trip testing (format -> parse -> format -> parse -> etc.) of
59b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * NumberFormat.
60b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
61b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid IntlTestNumberFormatAPI::testAPI(/* char* par */)
62b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
63b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
64b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
65b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// ======= Test constructors
66b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
67b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln("Testing NumberFormat constructors");
68b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
69b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    NumberFormat *def = NumberFormat::createInstance(status);
70b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status)) {
716d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        dataerrln("ERROR: Could not create NumberFormat (default) - %s", u_errorName(status));
72b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
73b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
74b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status = U_ZERO_ERROR;
75b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    NumberFormat *fr = NumberFormat::createInstance(Locale::getFrench(), status);
76b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status)) {
776d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        dataerrln("ERROR: Could not create NumberFormat (French) - %s", u_errorName(status));
78b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
79b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
80b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    NumberFormat *cur = NumberFormat::createCurrencyInstance(status);
81b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status)) {
826d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        dataerrln("ERROR: Could not create NumberFormat (currency, default) - %s", u_errorName(status));
83b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
84b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
85b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status = U_ZERO_ERROR;
86b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    NumberFormat *cur_fr = NumberFormat::createCurrencyInstance(Locale::getFrench(), status);
87b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status)) {
886d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        dataerrln("ERROR: Could not create NumberFormat (currency, French) - %s", u_errorName(status));
89b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
90b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
91b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    NumberFormat *per = NumberFormat::createPercentInstance(status);
92b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status)) {
936d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        dataerrln("ERROR: Could not create NumberFormat (percent, default) - %s", u_errorName(status));
94b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
95b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
96b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status = U_ZERO_ERROR;
97b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    NumberFormat *per_fr = NumberFormat::createPercentInstance(Locale::getFrench(), status);
98b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status)) {
996d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        dataerrln("ERROR: Could not create NumberFormat (percent, French) - %s", u_errorName(status));
100b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
101b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
102b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// ======= Test equality
103b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruif (per_fr != NULL && cur_fr != NULL)
104b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
105b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln("Testing equality operator");
106b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
107b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if( *per_fr == *cur_fr || ! ( *per_fr != *cur_fr) ) {
108b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("ERROR: == failed");
109b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
110b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
111b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
112b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// ======= Test various format() methods
113b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruif (cur_fr != NULL)
114b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
115b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln("Testing various format() methods");
116b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
117b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    double d = -10456.0037;
118b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t l = 100000000;
119b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Formattable fD(d);
120b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Formattable fL(l);
121b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
122b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString res1, res2, res3, res4, res5, res6;
123b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    FieldPosition pos1(0), pos2(0), pos3(0), pos4(0);
124b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
125b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    res1 = cur_fr->format(d, res1);
126b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln( (UnicodeString) "" + (int32_t) d + " formatted to " + res1);
127b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
128b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    res2 = cur_fr->format(l, res2);
129b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln((UnicodeString) "" + (int32_t) l + " formatted to " + res2);
130b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
131b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    res3 = cur_fr->format(d, res3, pos1);
132b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln( (UnicodeString) "" + (int32_t) d + " formatted to " + res3);
133b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
134b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    res4 = cur_fr->format(l, res4, pos2);
135b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln((UnicodeString) "" + (int32_t) l + " formatted to " + res4);
136b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
137b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status = U_ZERO_ERROR;
138b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    res5 = cur_fr->format(fD, res5, pos3, status);
139b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status)) {
140b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("ERROR: format(Formattable [double]) failed");
141b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
142b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln((UnicodeString) "" + (int32_t) fD.getDouble() + " formatted to " + res5);
143b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
144b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status = U_ZERO_ERROR;
145b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    res6 = cur_fr->format(fL, res6, pos4, status);
146b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status)) {
147b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("ERROR: format(Formattable [long]) failed");
148b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
149b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln((UnicodeString) "" + fL.getLong() + " formatted to " + res6);
150b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
151b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
152b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// ======= Test parse()
153b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruif (fr != NULL)
154b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
155b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln("Testing parse()");
156b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
157b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    double d = -10456.0037;
158b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString text("-10,456.0037");
159b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Formattable result1, result2, result3;
160b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ParsePosition pos(0), pos01(0);
161b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fr->parseObject(text, result1, pos);
162b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(result1.getType() != Formattable::kDouble && result1.getDouble() != d) {
163b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("ERROR: Roundtrip failed (via parse()) for " + text);
164b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
165b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln(text + " parsed into " + (int32_t) result1.getDouble());
166b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
167b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fr->parse(text, result2, pos01);
168b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(result2.getType() != Formattable::kDouble && result2.getDouble() != d) {
169b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("ERROR: Roundtrip failed (via parse()) for " + text);
170b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
171b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln(text + " parsed into " + (int32_t) result2.getDouble());
172b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
173b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status = U_ZERO_ERROR;
174b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fr->parse(text, result3, status);
175b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status)) {
176b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("ERROR: parse() failed");
177b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
178b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(result3.getType() != Formattable::kDouble && result3.getDouble() != d) {
179b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("ERROR: Roundtrip failed (via parse()) for " + text);
180b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
181b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln(text + " parsed into " + (int32_t) result3.getDouble());
182b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
183b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
184b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// ======= Test getters and setters
185b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruif (fr != NULL && def != NULL)
186b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
187b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln("Testing getters and setters");
188b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
189b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t count = 0;
190b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const Locale *locales = NumberFormat::getAvailableLocales(count);
191b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln((UnicodeString) "Got " + count + " locales" );
192b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for(int32_t i = 0; i < count; i++) {
193b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString name(locales[i].getName(),"");
194b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln(name);
195b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
196b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
197b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fr->setParseIntegerOnly( def->isParseIntegerOnly() );
198b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(fr->isParseIntegerOnly() != def->isParseIntegerOnly() ) {
199b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("ERROR: setParseIntegerOnly() failed");
200b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
201b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
202b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fr->setGroupingUsed( def->isGroupingUsed() );
203b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(fr->isGroupingUsed() != def->isGroupingUsed() ) {
204b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("ERROR: setGroupingUsed() failed");
205b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
206b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
207b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fr->setMaximumIntegerDigits( def->getMaximumIntegerDigits() );
208b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(fr->getMaximumIntegerDigits() != def->getMaximumIntegerDigits() ) {
209b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("ERROR: setMaximumIntegerDigits() failed");
210b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
211b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
212b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fr->setMinimumIntegerDigits( def->getMinimumIntegerDigits() );
213b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(fr->getMinimumIntegerDigits() != def->getMinimumIntegerDigits() ) {
214b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("ERROR: setMinimumIntegerDigits() failed");
215b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
216b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
217b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fr->setMaximumFractionDigits( def->getMaximumFractionDigits() );
218b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(fr->getMaximumFractionDigits() != def->getMaximumFractionDigits() ) {
219b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("ERROR: setMaximumFractionDigits() failed");
220b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
221b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
222b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fr->setMinimumFractionDigits( def->getMinimumFractionDigits() );
223b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(fr->getMinimumFractionDigits() != def->getMinimumFractionDigits() ) {
224b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("ERROR: setMinimumFractionDigits() failed");
225b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
226b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
227b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
228b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// ======= Test getStaticClassID()
229b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
230b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln("Testing getStaticClassID()");
231b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
232b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status = U_ZERO_ERROR;
233b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    NumberFormat *test = new DecimalFormat(status);
234b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status)) {
2356d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        errcheckln(status, "ERROR: Couldn't create a NumberFormat - %s", u_errorName(status));
236b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
237b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
238b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(test->getDynamicClassID() != DecimalFormat::getStaticClassID()) {
239b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("ERROR: getDynamicClassID() didn't return the expected value");
240b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
241b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
242b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete test;
243b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete def;
244b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete fr;
245b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete cur;
246b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete cur_fr;
247b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete per;
248b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete per_fr;
249b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
250b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
251b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_SERVICE
252b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
253b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define SRC_LOC Locale::getFrance()
254b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define SWAP_LOC Locale::getUS()
255b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
256b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruclass NFTestFactory : public SimpleNumberFormatFactory {
257b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    NumberFormat* currencyStyle;
258b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
259b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querupublic:
260b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    NFTestFactory()
261b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        : SimpleNumberFormatFactory(SRC_LOC, TRUE)
262b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
263b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UErrorCode status = U_ZERO_ERROR;
264b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        currencyStyle = NumberFormat::createInstance(SWAP_LOC, status);
265b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
266b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
267b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    virtual ~NFTestFactory()
268b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
269b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        delete currencyStyle;
270b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
271b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
272b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    virtual NumberFormat* createFormat(const Locale& /* loc */, UNumberFormatStyle formatType)
273b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
274b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (formatType == UNUM_CURRENCY) {
275b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return (NumberFormat*)currencyStyle->clone();
276b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
277b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return NULL;
278b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
279b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
280b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru   virtual inline UClassID getDynamicClassID() const
281b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru   {
282b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru       return (UClassID)&gID;
283b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru   }
284b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
285b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru   static inline UClassID getStaticClassID()
286b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru   {
287b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return (UClassID)&gID;
288b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru   }
289b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
290b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruprivate:
291b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru   static char gID;
292b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru};
293b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
294b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruchar NFTestFactory::gID = 0;
295b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
296b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
297b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid
298b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruIntlTestNumberFormatAPI::testRegistration()
299b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
300b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_SERVICE
301b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
302b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
30350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    LocalPointer<NumberFormat> f0(NumberFormat::createInstance(SWAP_LOC, status));
30450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    LocalPointer<NumberFormat> f1(NumberFormat::createInstance(SRC_LOC, status));
30550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    LocalPointer<NumberFormat> f2(NumberFormat::createCurrencyInstance(SRC_LOC, status));
306b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    URegistryKey key = NumberFormat::registerFactory(new NFTestFactory(), status);
30750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    LocalPointer<NumberFormat> f3(NumberFormat::createCurrencyInstance(SRC_LOC, status));
30850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    LocalPointer<NumberFormat> f3a(NumberFormat::createCurrencyInstance(SRC_LOC, status));
30950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    LocalPointer<NumberFormat> f4(NumberFormat::createInstance(SRC_LOC, status));
310b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
311b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    StringEnumeration* locs = NumberFormat::getAvailableLocales();
312b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
31350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    LocalUNumberFormatPointer uf3(unum_open(UNUM_CURRENCY, NULL, 0, SRC_LOC.getName(), NULL, &status));
31450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    LocalUNumberFormatPointer uf4(unum_open(UNUM_DEFAULT, NULL, 0, SRC_LOC.getName(), NULL, &status));
315b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
316b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const UnicodeString* res;
317b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (res = locs->snext(status); res; res = locs->snext(status)) {
318b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln(*res); // service is still in synch
319b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
320b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
321b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    NumberFormat::unregister(key, status); // restore for other tests
32250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    LocalPointer<NumberFormat> f5(NumberFormat::createCurrencyInstance(SRC_LOC, status));
32350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    LocalUNumberFormatPointer uf5(unum_open(UNUM_CURRENCY, NULL, 0, SRC_LOC.getName(), NULL, &status));
324b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
325b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
326b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        dataerrln("Error creating instnaces.");
327b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
328b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else {
329b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        float n = 1234.567f;
330b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString res0, res1, res2, res3, res4, res5;
331b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UChar ures3[50];
332b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UChar ures4[50];
333b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UChar ures5[50];
334b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
335b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        f0->format(n, res0);
336b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        f1->format(n, res1);
337b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        f2->format(n, res2);
338b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        f3->format(n, res3);
339b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        f4->format(n, res4);
340b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        f5->format(n, res5);
341b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
34250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        unum_formatDouble(uf3.getAlias(), n, ures3, 50, NULL, &status);
34350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        unum_formatDouble(uf4.getAlias(), n, ures4, 50, NULL, &status);
34450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        unum_formatDouble(uf5.getAlias(), n, ures5, 50, NULL, &status);
345b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
346b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln((UnicodeString)"f0 swap int: " + res0);
347b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln((UnicodeString)"f1 src int: " + res1);
348b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln((UnicodeString)"f2 src cur: " + res2);
349b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln((UnicodeString)"f3 reg cur: " + res3);
350b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln((UnicodeString)"f4 reg int: " + res4);
351b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln((UnicodeString)"f5 unreg cur: " + res5);
352b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log("uf3 reg cur: ");
353b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln(ures3);
354b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log("uf4 reg int: ");
355b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln(ures4);
356b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log("uf5 ureg cur: ");
357b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln(ures5);
358b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
35950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        if (f3.getAlias() == f3a.getAlias()) {
360b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln("did not get new instance from service");
36150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            f3a.orphan();
362b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
363b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (res3 != res0) {
364b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln("registered service did not match");
365b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
366b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (res4 != res1) {
367b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln("registered service did not inherit");
368b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
369b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (res5 != res2) {
370b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln("unregistered service did not match original");
371b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
372b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
373b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (res0 != ures3) {
374b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln("registered service did not match / unum");
375b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
376b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (res1 != ures4) {
377b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln("registered service did not inherit / unum");
378b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
379b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (res2 != ures5) {
380b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln("unregistered service did not match original / unum");
381b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
382b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
383b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
384b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (res = locs->snext(status); res; res = locs->snext(status)) {
385b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln(*res); // service should be out of synch
386b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
387b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
388b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    locs->reset(status); // now in synch again, we hope
389b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (res = locs->snext(status); res; res = locs->snext(status)) {
390b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln(*res);
391b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
392b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
393b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete locs;
394b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
395b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
396b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
397b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
398b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif /* #if !UCONFIG_NO_FORMATTING */
399