]>
Commit | Line | Data |
---|---|---|
1 | /******************************************************************** | |
2 | * COPYRIGHT: | |
3 | * Copyright (c) 1997-2013, 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) { | |
19 | logln("TestSuite DecimalFormatSymbols:"); | |
20 | } | |
21 | TESTCASE_AUTO_BEGIN; | |
22 | TESTCASE_AUTO(testSymbols); | |
23 | TESTCASE_AUTO(testLastResortData); | |
24 | TESTCASE_AUTO_END; | |
25 | } | |
26 | ||
27 | /** | |
28 | * Test the API of DecimalFormatSymbols; primarily a simple get/set set. | |
29 | */ | |
30 | void IntlTestDecimalFormatSymbols::testSymbols(/* char *par */) | |
31 | { | |
32 | UErrorCode status = U_ZERO_ERROR; | |
33 | ||
34 | DecimalFormatSymbols fr(Locale::getFrench(), status); | |
35 | if(U_FAILURE(status)) { | |
36 | errcheckln(status, "ERROR: Couldn't create French DecimalFormatSymbols - %s", u_errorName(status)); | |
37 | return; | |
38 | } | |
39 | ||
40 | status = U_ZERO_ERROR; | |
41 | DecimalFormatSymbols en(Locale::getEnglish(), status); | |
42 | if(U_FAILURE(status)) { | |
43 | errcheckln(status, "ERROR: Couldn't create English DecimalFormatSymbols - %s", u_errorName(status)); | |
44 | return; | |
45 | } | |
46 | ||
47 | if(en == fr || ! (en != fr) ) { | |
48 | errln("ERROR: English DecimalFormatSymbols equal to French"); | |
49 | } | |
50 | ||
51 | // just do some VERY basic tests to make sure that get/set work | |
52 | ||
53 | UnicodeString zero = en.getSymbol(DecimalFormatSymbols::kZeroDigitSymbol); | |
54 | fr.setSymbol(DecimalFormatSymbols::kZeroDigitSymbol, zero); | |
55 | if(fr.getSymbol(DecimalFormatSymbols::kZeroDigitSymbol) != en.getSymbol(DecimalFormatSymbols::kZeroDigitSymbol)) { | |
56 | errln("ERROR: get/set ZeroDigit failed"); | |
57 | } | |
58 | ||
59 | UnicodeString group = en.getSymbol(DecimalFormatSymbols::kGroupingSeparatorSymbol); | |
60 | fr.setSymbol(DecimalFormatSymbols::kGroupingSeparatorSymbol, group); | |
61 | if(fr.getSymbol(DecimalFormatSymbols::kGroupingSeparatorSymbol) != en.getSymbol(DecimalFormatSymbols::kGroupingSeparatorSymbol)) { | |
62 | errln("ERROR: get/set GroupingSeparator failed"); | |
63 | } | |
64 | ||
65 | UnicodeString decimal = en.getSymbol(DecimalFormatSymbols::kDecimalSeparatorSymbol); | |
66 | fr.setSymbol(DecimalFormatSymbols::kDecimalSeparatorSymbol, decimal); | |
67 | if(fr.getSymbol(DecimalFormatSymbols::kDecimalSeparatorSymbol) != en.getSymbol(DecimalFormatSymbols::kDecimalSeparatorSymbol)) { | |
68 | errln("ERROR: get/set DecimalSeparator failed"); | |
69 | } | |
70 | ||
71 | UnicodeString perMill = en.getSymbol(DecimalFormatSymbols::kPerMillSymbol); | |
72 | fr.setSymbol(DecimalFormatSymbols::kPerMillSymbol, perMill); | |
73 | if(fr.getSymbol(DecimalFormatSymbols::kPerMillSymbol) != en.getSymbol(DecimalFormatSymbols::kPerMillSymbol)) { | |
74 | errln("ERROR: get/set PerMill failed"); | |
75 | } | |
76 | ||
77 | UnicodeString percent = en.getSymbol(DecimalFormatSymbols::kPercentSymbol); | |
78 | fr.setSymbol(DecimalFormatSymbols::kPercentSymbol, percent); | |
79 | if(fr.getSymbol(DecimalFormatSymbols::kPercentSymbol) != en.getSymbol(DecimalFormatSymbols::kPercentSymbol)) { | |
80 | errln("ERROR: get/set Percent failed"); | |
81 | } | |
82 | ||
83 | UnicodeString digit(en.getSymbol(DecimalFormatSymbols::kDigitSymbol)); | |
84 | fr.setSymbol(DecimalFormatSymbols::kDigitSymbol, digit); | |
85 | if(fr.getSymbol(DecimalFormatSymbols::kDigitSymbol) != en.getSymbol(DecimalFormatSymbols::kDigitSymbol)) { | |
86 | errln("ERROR: get/set Percent failed"); | |
87 | } | |
88 | ||
89 | UnicodeString patternSeparator = en.getSymbol(DecimalFormatSymbols::kPatternSeparatorSymbol); | |
90 | fr.setSymbol(DecimalFormatSymbols::kPatternSeparatorSymbol, patternSeparator); | |
91 | if(fr.getSymbol(DecimalFormatSymbols::kPatternSeparatorSymbol) != en.getSymbol(DecimalFormatSymbols::kPatternSeparatorSymbol)) { | |
92 | errln("ERROR: get/set PatternSeparator failed"); | |
93 | } | |
94 | ||
95 | UnicodeString infinity(en.getSymbol(DecimalFormatSymbols::kInfinitySymbol)); | |
96 | fr.setSymbol(DecimalFormatSymbols::kInfinitySymbol, infinity); | |
97 | UnicodeString infinity2(fr.getSymbol(DecimalFormatSymbols::kInfinitySymbol)); | |
98 | if(infinity != infinity2) { | |
99 | errln("ERROR: get/set Infinity failed"); | |
100 | } | |
101 | ||
102 | UnicodeString nan(en.getSymbol(DecimalFormatSymbols::kNaNSymbol)); | |
103 | fr.setSymbol(DecimalFormatSymbols::kNaNSymbol, nan); | |
104 | UnicodeString nan2(fr.getSymbol(DecimalFormatSymbols::kNaNSymbol)); | |
105 | if(nan != nan2) { | |
106 | errln("ERROR: get/set NaN failed"); | |
107 | } | |
108 | ||
109 | UnicodeString minusSign = en.getSymbol(DecimalFormatSymbols::kMinusSignSymbol); | |
110 | fr.setSymbol(DecimalFormatSymbols::kMinusSignSymbol, minusSign); | |
111 | if(fr.getSymbol(DecimalFormatSymbols::kMinusSignSymbol) != en.getSymbol(DecimalFormatSymbols::kMinusSignSymbol)) { | |
112 | errln("ERROR: get/set MinusSign failed"); | |
113 | } | |
114 | ||
115 | UnicodeString exponential(en.getSymbol(DecimalFormatSymbols::kExponentialSymbol)); | |
116 | fr.setSymbol(DecimalFormatSymbols::kExponentialSymbol, exponential); | |
117 | if(fr.getSymbol(DecimalFormatSymbols::kExponentialSymbol) != en.getSymbol(DecimalFormatSymbols::kExponentialSymbol)) { | |
118 | errln("ERROR: get/set Exponential failed"); | |
119 | } | |
120 | ||
121 | // Test get currency spacing before the currency. | |
122 | status = U_ZERO_ERROR; | |
123 | for (int32_t i = 0; i < (int32_t)UNUM_CURRENCY_SPACING_COUNT; i++) { | |
124 | UnicodeString enCurrencyPattern = en.getPatternForCurrencySpacing( | |
125 | (UCurrencySpacing)i, TRUE, status); | |
126 | if(U_FAILURE(status)) { | |
127 | errln("Error: cannot get CurrencyMatch for locale:en"); | |
128 | status = U_ZERO_ERROR; | |
129 | } | |
130 | UnicodeString frCurrencyPattern = fr.getPatternForCurrencySpacing( | |
131 | (UCurrencySpacing)i, TRUE, status); | |
132 | if(U_FAILURE(status)) { | |
133 | errln("Error: cannot get CurrencyMatch for locale:fr"); | |
134 | } | |
135 | if (enCurrencyPattern != frCurrencyPattern) { | |
136 | errln("ERROR: get CurrencySpacing failed"); | |
137 | } | |
138 | } | |
139 | // Test get currencySpacing after the currency. | |
140 | status = U_ZERO_ERROR; | |
141 | for (int32_t i = 0; i < UNUM_CURRENCY_SPACING_COUNT; i++) { | |
142 | UnicodeString enCurrencyPattern = en.getPatternForCurrencySpacing( | |
143 | (UCurrencySpacing)i, FALSE, status); | |
144 | if(U_FAILURE(status)) { | |
145 | errln("Error: cannot get CurrencyMatch for locale:en"); | |
146 | status = U_ZERO_ERROR; | |
147 | } | |
148 | UnicodeString frCurrencyPattern = fr.getPatternForCurrencySpacing( | |
149 | (UCurrencySpacing)i, FALSE, status); | |
150 | if(U_FAILURE(status)) { | |
151 | errln("Error: cannot get CurrencyMatch for locale:fr"); | |
152 | } | |
153 | if (enCurrencyPattern != frCurrencyPattern) { | |
154 | errln("ERROR: get CurrencySpacing failed"); | |
155 | } | |
156 | } | |
157 | // Test set curerncySpacing APIs | |
158 | status = U_ZERO_ERROR; | |
159 | UnicodeString dash = UnicodeString("-"); | |
160 | en.setPatternForCurrencySpacing(UNUM_CURRENCY_INSERT, TRUE, dash); | |
161 | UnicodeString enCurrencyInsert = en.getPatternForCurrencySpacing( | |
162 | UNUM_CURRENCY_INSERT, TRUE, status); | |
163 | if (dash != enCurrencyInsert) { | |
164 | errln("Error: Failed to setCurrencyInsert for locale:en"); | |
165 | } | |
166 | ||
167 | status = U_ZERO_ERROR; | |
168 | DecimalFormatSymbols foo(status); | |
169 | ||
170 | DecimalFormatSymbols bar(foo); | |
171 | ||
172 | en = fr; | |
173 | ||
174 | if(en != fr || foo != bar) { | |
175 | errln("ERROR: Copy Constructor or Assignment failed"); | |
176 | } | |
177 | ||
178 | // test get/setSymbol() | |
179 | if((int) UNUM_FORMAT_SYMBOL_COUNT != (int) DecimalFormatSymbols::kFormatSymbolCount) { | |
180 | errln("unum.h and decimfmt.h have inconsistent numbers of format symbols!"); | |
181 | return; | |
182 | } | |
183 | ||
184 | int i; | |
185 | for(i = 0; i < (int)DecimalFormatSymbols::kFormatSymbolCount; ++i) { | |
186 | foo.setSymbol((DecimalFormatSymbols::ENumberFormatSymbol)i, UnicodeString((UChar32)(0x10330 + i))); | |
187 | } | |
188 | for(i = 0; i < (int)DecimalFormatSymbols::kFormatSymbolCount; ++i) { | |
189 | if(foo.getSymbol((DecimalFormatSymbols::ENumberFormatSymbol)i) != UnicodeString((UChar32)(0x10330 + i))) { | |
190 | errln("get/setSymbol did not roundtrip, got " + | |
191 | foo.getSymbol((DecimalFormatSymbols::ENumberFormatSymbol)i) + | |
192 | ", expected " + | |
193 | UnicodeString((UChar32)(0x10330 + i))); | |
194 | } | |
195 | } | |
196 | ||
197 | DecimalFormatSymbols sym(Locale::getUS(), status); | |
198 | ||
199 | UnicodeString customDecSeperator("S"); | |
200 | Verify(34.5, (UnicodeString)"00.00", sym, (UnicodeString)"34.50"); | |
201 | sym.setSymbol(DecimalFormatSymbols::kDecimalSeparatorSymbol, customDecSeperator); | |
202 | Verify(34.5, (UnicodeString)"00.00", sym, (UnicodeString)"34S50"); | |
203 | sym.setSymbol(DecimalFormatSymbols::kPercentSymbol, (UnicodeString)"P"); | |
204 | Verify(34.5, (UnicodeString)"00 %", sym, (UnicodeString)"3450 P"); | |
205 | sym.setSymbol(DecimalFormatSymbols::kCurrencySymbol, (UnicodeString)"D"); | |
206 | Verify(34.5, CharsToUnicodeString("\\u00a4##.##"), sym, (UnicodeString)"D34.5"); | |
207 | sym.setSymbol(DecimalFormatSymbols::kGroupingSeparatorSymbol, (UnicodeString)"|"); | |
208 | Verify(3456.5, (UnicodeString)"0,000.##", sym, (UnicodeString)"3|456S5"); | |
209 | ||
210 | } | |
211 | ||
212 | void IntlTestDecimalFormatSymbols::testLastResortData() { | |
213 | IcuTestErrorCode errorCode(*this, "testLastResortData"); | |
214 | LocalPointer<DecimalFormatSymbols> lastResort( | |
215 | DecimalFormatSymbols::createWithLastResortData(errorCode)); | |
216 | if(errorCode.logIfFailureAndReset("DecimalFormatSymbols::createWithLastResortData() failed")) { | |
217 | return; | |
218 | } | |
219 | DecimalFormatSymbols root(Locale::getRoot(), errorCode); | |
220 | if(errorCode.logDataIfFailureAndReset("DecimalFormatSymbols(root) failed")) { | |
221 | return; | |
222 | } | |
223 | // Note: It is not necessary that the last resort data matches the root locale, | |
224 | // but it seems weird if most symbols did not match. | |
225 | // Also, one purpose for calling operator==() is to find uninitialized memory in a debug build. | |
226 | if(*lastResort == root) { | |
227 | errln("DecimalFormatSymbols last resort data unexpectedly matches root"); | |
228 | } | |
229 | // Here we adjust for expected differences. | |
230 | assertEquals("last-resort grouping separator", | |
231 | "", lastResort->getSymbol(DecimalFormatSymbols::kGroupingSeparatorSymbol)); | |
232 | lastResort->setSymbol(DecimalFormatSymbols::kGroupingSeparatorSymbol, ","); | |
233 | assertEquals("last-resort monetary grouping separator", | |
234 | "", lastResort->getSymbol(DecimalFormatSymbols::kMonetaryGroupingSeparatorSymbol)); | |
235 | lastResort->setSymbol(DecimalFormatSymbols::kMonetaryGroupingSeparatorSymbol, ","); | |
236 | assertEquals("last-resort NaN", | |
237 | UnicodeString((UChar)0xfffd), lastResort->getSymbol(DecimalFormatSymbols::kNaNSymbol)); | |
238 | lastResort->setSymbol(DecimalFormatSymbols::kNaNSymbol, "NaN"); | |
239 | // Check that now all of the symbols match root. | |
240 | for(int32_t i = 0; i < DecimalFormatSymbols::kFormatSymbolCount; ++i) { | |
241 | DecimalFormatSymbols::ENumberFormatSymbol e = (DecimalFormatSymbols::ENumberFormatSymbol)i; | |
242 | assertEquals("last-resort symbol vs. root", root.getSymbol(e), lastResort->getSymbol(e)); | |
243 | } | |
244 | // Also, the CurrencySpacing patterns are empty in the last resort instance, | |
245 | // but not in root. | |
246 | Verify(1234567.25, "#,##0.##", *lastResort, "1,234,567.25"); | |
247 | } | |
248 | ||
249 | void IntlTestDecimalFormatSymbols::Verify(double value, const UnicodeString& pattern, | |
250 | const DecimalFormatSymbols &sym, const UnicodeString& expected){ | |
251 | UErrorCode status = U_ZERO_ERROR; | |
252 | DecimalFormat df(pattern, sym, status); | |
253 | if(U_FAILURE(status)){ | |
254 | errln("ERROR: construction of decimal format failed - %s", u_errorName(status)); | |
255 | } | |
256 | UnicodeString buffer; | |
257 | FieldPosition pos(FieldPosition::DONT_CARE); | |
258 | buffer = df.format(value, buffer, pos); | |
259 | if(buffer != expected){ | |
260 | errln((UnicodeString)"ERROR: format() returns wrong result\n Expected " + | |
261 | expected + ", Got " + buffer); | |
262 | } | |
263 | } | |
264 | ||
265 | #endif /* #if !UCONFIG_NO_FORMATTING */ |