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