1/********************************************************************
2 * COPYRIGHT:
3 * Copyright (c) 1997-2010, International Business Machines Corporation and
4 * others. All Rights Reserved.
5 ********************************************************************/
6
7#include "unicode/utypes.h"
8
9#if !UCONFIG_NO_FORMATTING
10
11#include "unicode/dcfmtsym.h"
12#include "unicode/decimfmt.h"
13#include "unicode/unum.h"
14#include "tsdcfmsy.h"
15
16void IntlTestDecimalFormatSymbols::runIndexedTest( int32_t index, UBool exec, const char* &name, char* /*par*/ )
17{
18    if (exec) logln("TestSuite DecimalFormatSymbols");
19    switch (index) {
20        case 0: name = "DecimalFormatSymbols test";
21                if (exec) {
22                    logln("DecimalFormatSymbols test---"); logln("");
23                    testSymbols(/*par*/);
24                }
25                break;
26
27        default: name = ""; break;
28    }
29}
30
31/**
32 * Test the API of DecimalFormatSymbols; primarily a simple get/set set.
33 */
34void IntlTestDecimalFormatSymbols::testSymbols(/* char *par */)
35{
36    UErrorCode status = U_ZERO_ERROR;
37
38    DecimalFormatSymbols fr(Locale::getFrench(), status);
39    if(U_FAILURE(status)) {
40        errcheckln(status, "ERROR: Couldn't create French DecimalFormatSymbols - %s", u_errorName(status));
41        return;
42    }
43
44    status = U_ZERO_ERROR;
45    DecimalFormatSymbols en(Locale::getEnglish(), status);
46    if(U_FAILURE(status)) {
47        errcheckln(status, "ERROR: Couldn't create English DecimalFormatSymbols - %s", u_errorName(status));
48        return;
49    }
50
51    if(en == fr || ! (en != fr) ) {
52        errln("ERROR: English DecimalFormatSymbols equal to French");
53    }
54
55    // just do some VERY basic tests to make sure that get/set work
56
57    UnicodeString zero = en.getSymbol(DecimalFormatSymbols::kZeroDigitSymbol);
58    fr.setSymbol(DecimalFormatSymbols::kZeroDigitSymbol, zero);
59    if(fr.getSymbol(DecimalFormatSymbols::kZeroDigitSymbol) != en.getSymbol(DecimalFormatSymbols::kZeroDigitSymbol)) {
60        errln("ERROR: get/set ZeroDigit failed");
61    }
62
63    UnicodeString group = en.getSymbol(DecimalFormatSymbols::kGroupingSeparatorSymbol);
64    fr.setSymbol(DecimalFormatSymbols::kGroupingSeparatorSymbol, group);
65    if(fr.getSymbol(DecimalFormatSymbols::kGroupingSeparatorSymbol) != en.getSymbol(DecimalFormatSymbols::kGroupingSeparatorSymbol)) {
66        errln("ERROR: get/set GroupingSeparator failed");
67    }
68
69    UnicodeString decimal = en.getSymbol(DecimalFormatSymbols::kDecimalSeparatorSymbol);
70    fr.setSymbol(DecimalFormatSymbols::kDecimalSeparatorSymbol, decimal);
71    if(fr.getSymbol(DecimalFormatSymbols::kDecimalSeparatorSymbol) != en.getSymbol(DecimalFormatSymbols::kDecimalSeparatorSymbol)) {
72        errln("ERROR: get/set DecimalSeparator failed");
73    }
74
75    UnicodeString perMill = en.getSymbol(DecimalFormatSymbols::kPerMillSymbol);
76    fr.setSymbol(DecimalFormatSymbols::kPerMillSymbol, perMill);
77    if(fr.getSymbol(DecimalFormatSymbols::kPerMillSymbol) != en.getSymbol(DecimalFormatSymbols::kPerMillSymbol)) {
78        errln("ERROR: get/set PerMill failed");
79    }
80
81    UnicodeString percent = en.getSymbol(DecimalFormatSymbols::kPercentSymbol);
82    fr.setSymbol(DecimalFormatSymbols::kPercentSymbol, percent);
83    if(fr.getSymbol(DecimalFormatSymbols::kPercentSymbol) != en.getSymbol(DecimalFormatSymbols::kPercentSymbol)) {
84        errln("ERROR: get/set Percent failed");
85    }
86
87    UnicodeString digit(en.getSymbol(DecimalFormatSymbols::kDigitSymbol));
88    fr.setSymbol(DecimalFormatSymbols::kDigitSymbol, digit);
89    if(fr.getSymbol(DecimalFormatSymbols::kDigitSymbol) != en.getSymbol(DecimalFormatSymbols::kDigitSymbol)) {
90        errln("ERROR: get/set Percent failed");
91    }
92
93    UnicodeString patternSeparator = en.getSymbol(DecimalFormatSymbols::kPatternSeparatorSymbol);
94    fr.setSymbol(DecimalFormatSymbols::kPatternSeparatorSymbol, patternSeparator);
95    if(fr.getSymbol(DecimalFormatSymbols::kPatternSeparatorSymbol) != en.getSymbol(DecimalFormatSymbols::kPatternSeparatorSymbol)) {
96        errln("ERROR: get/set PatternSeparator failed");
97    }
98
99    UnicodeString infinity(en.getSymbol(DecimalFormatSymbols::kInfinitySymbol));
100    fr.setSymbol(DecimalFormatSymbols::kInfinitySymbol, infinity);
101    UnicodeString infinity2(fr.getSymbol(DecimalFormatSymbols::kInfinitySymbol));
102    if(infinity != infinity2) {
103        errln("ERROR: get/set Infinity failed");
104    }
105
106    UnicodeString nan(en.getSymbol(DecimalFormatSymbols::kNaNSymbol));
107    fr.setSymbol(DecimalFormatSymbols::kNaNSymbol, nan);
108    UnicodeString nan2(fr.getSymbol(DecimalFormatSymbols::kNaNSymbol));
109    if(nan != nan2) {
110        errln("ERROR: get/set NaN failed");
111    }
112
113    UnicodeString minusSign = en.getSymbol(DecimalFormatSymbols::kMinusSignSymbol);
114    fr.setSymbol(DecimalFormatSymbols::kMinusSignSymbol, minusSign);
115    if(fr.getSymbol(DecimalFormatSymbols::kMinusSignSymbol) != en.getSymbol(DecimalFormatSymbols::kMinusSignSymbol)) {
116        errln("ERROR: get/set MinusSign failed");
117    }
118
119    UnicodeString exponential(en.getSymbol(DecimalFormatSymbols::kExponentialSymbol));
120    fr.setSymbol(DecimalFormatSymbols::kExponentialSymbol, exponential);
121    if(fr.getSymbol(DecimalFormatSymbols::kExponentialSymbol) != en.getSymbol(DecimalFormatSymbols::kExponentialSymbol)) {
122        errln("ERROR: get/set Exponential failed");
123    }
124
125    // Test get currency spacing before the currency.
126    status = U_ZERO_ERROR;
127    for (int32_t i = 0; i < (int32_t)UNUM_CURRENCY_SPACING_COUNT; i++) {
128        UnicodeString enCurrencyPattern = en.getPatternForCurrencySpacing(
129             (UCurrencySpacing)i, TRUE, status);
130        if(U_FAILURE(status)) {
131            errln("Error: cannot get CurrencyMatch for locale:en");
132            status = U_ZERO_ERROR;
133        }
134        UnicodeString frCurrencyPattern = fr.getPatternForCurrencySpacing(
135             (UCurrencySpacing)i, TRUE, status);
136        if(U_FAILURE(status)) {
137            errln("Error: cannot get CurrencyMatch for locale:fr");
138        }
139        if (enCurrencyPattern != frCurrencyPattern) {
140           errln("ERROR: get CurrencySpacing failed");
141        }
142    }
143    // Test get currencySpacing after the currency.
144    status = U_ZERO_ERROR;
145    for (int32_t i = 0; i < UNUM_CURRENCY_SPACING_COUNT; i++) {
146        UnicodeString enCurrencyPattern = en.getPatternForCurrencySpacing(
147            (UCurrencySpacing)i, FALSE, status);
148        if(U_FAILURE(status)) {
149            errln("Error: cannot get CurrencyMatch for locale:en");
150            status = U_ZERO_ERROR;
151        }
152        UnicodeString frCurrencyPattern = fr.getPatternForCurrencySpacing(
153             (UCurrencySpacing)i, FALSE, status);
154        if(U_FAILURE(status)) {
155            errln("Error: cannot get CurrencyMatch for locale:fr");
156        }
157        if (enCurrencyPattern != frCurrencyPattern) {
158            errln("ERROR: get CurrencySpacing failed");
159        }
160    }
161    // Test set curerncySpacing APIs
162    status = U_ZERO_ERROR;
163    UnicodeString dash = UnicodeString("-");
164    en.setPatternForCurrencySpacing(UNUM_CURRENCY_INSERT, TRUE, dash);
165    UnicodeString enCurrencyInsert = en.getPatternForCurrencySpacing(
166        UNUM_CURRENCY_INSERT, TRUE, status);
167    if (dash != enCurrencyInsert) {
168        errln("Error: Failed to setCurrencyInsert for locale:en");
169    }
170
171    status = U_ZERO_ERROR;
172    DecimalFormatSymbols foo(status);
173
174    DecimalFormatSymbols bar(foo);
175
176    en = fr;
177
178    if(en != fr || foo != bar) {
179        errln("ERROR: Copy Constructor or Assignment failed");
180    }
181
182    // test get/setSymbol()
183    if((int) UNUM_FORMAT_SYMBOL_COUNT != (int) DecimalFormatSymbols::kFormatSymbolCount) {
184        errln("unum.h and decimfmt.h have inconsistent numbers of format symbols!");
185        return;
186    }
187
188    int i;
189    for(i = 0; i < (int)DecimalFormatSymbols::kFormatSymbolCount; ++i) {
190        foo.setSymbol((DecimalFormatSymbols::ENumberFormatSymbol)i, UnicodeString((UChar32)(0x10330 + i)));
191    }
192    for(i = 0; i < (int)DecimalFormatSymbols::kFormatSymbolCount; ++i) {
193        if(foo.getSymbol((DecimalFormatSymbols::ENumberFormatSymbol)i) != UnicodeString((UChar32)(0x10330 + i))) {
194            errln("get/setSymbol did not roundtrip, got " +
195                  foo.getSymbol((DecimalFormatSymbols::ENumberFormatSymbol)i) +
196                  ", expected " +
197                  UnicodeString((UChar32)(0x10330 + i)));
198        }
199    }
200
201    DecimalFormatSymbols sym(Locale::getUS(), status);
202
203    UnicodeString customDecSeperator("S");
204    Verify(34.5, (UnicodeString)"00.00", sym, (UnicodeString)"34.50");
205    sym.setSymbol(DecimalFormatSymbols::kDecimalSeparatorSymbol, customDecSeperator);
206    Verify(34.5, (UnicodeString)"00.00", sym, (UnicodeString)"34S50");
207    sym.setSymbol(DecimalFormatSymbols::kPercentSymbol, (UnicodeString)"P");
208    Verify(34.5, (UnicodeString)"00 %", sym, (UnicodeString)"3450 P");
209    sym.setSymbol(DecimalFormatSymbols::kCurrencySymbol, (UnicodeString)"D");
210    Verify(34.5, CharsToUnicodeString("\\u00a4##.##"), sym, (UnicodeString)"D34.5");
211    sym.setSymbol(DecimalFormatSymbols::kGroupingSeparatorSymbol, (UnicodeString)"|");
212    Verify(3456.5, (UnicodeString)"0,000.##", sym, (UnicodeString)"3|456S5");
213
214}
215
216void IntlTestDecimalFormatSymbols::Verify(double value, const UnicodeString& pattern, DecimalFormatSymbols sym, const UnicodeString& expected){
217    UErrorCode status = U_ZERO_ERROR;
218    DecimalFormat *df = new DecimalFormat(pattern, sym, status);
219    if(U_FAILURE(status)){
220        errln("ERROR: construction of decimal format failed");
221    }
222    UnicodeString buffer;
223    FieldPosition pos(FieldPosition::DONT_CARE);
224    buffer = df->format(value, buffer, pos);
225    if(buffer != expected){
226        errln((UnicodeString)"ERROR: format failed after setSymbols()\n Expected " +
227            expected + ", Got " + buffer);
228    }
229    delete df;
230}
231
232#endif /* #if !UCONFIG_NO_FORMATTING */
233