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