]>
Commit | Line | Data |
---|---|---|
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 | ||
16 | void 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 | */ | |
34 | void 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 | ||
216 | void 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 */ |