OLD | NEW |
| (Empty) |
1 /* | |
2 ******************************************************************************* | |
3 * Copyright (C) 2015, International Business Machines Corporation and * | |
4 * others. All Rights Reserved. * | |
5 ******************************************************************************* | |
6 * | |
7 * File NUMBERFORMAT2TEST.CPP | |
8 * | |
9 ******************************************************************************* | |
10 */ | |
11 #include "unicode/utypes.h" | |
12 | |
13 #include "intltest.h" | |
14 | |
15 #if !UCONFIG_NO_FORMATTING | |
16 | |
17 #include "unicode/localpointer.h" | |
18 #include "unicode/plurrule.h" | |
19 | |
20 #include "affixpatternparser.h" | |
21 #include "charstr.h" | |
22 #include "datadrivennumberformattestsuite.h" | |
23 #include "decimalformatpattern.h" | |
24 #include "digitaffixesandpadding.h" | |
25 #include "digitformatter.h" | |
26 #include "digitgrouping.h" | |
27 #include "digitinterval.h" | |
28 #include "digitlst.h" | |
29 #include "fphdlimp.h" | |
30 #include "plurrule_impl.h" | |
31 #include "precision.h" | |
32 #include "significantdigitinterval.h" | |
33 #include "smallintformatter.h" | |
34 #include "uassert.h" | |
35 #include "valueformatter.h" | |
36 #include "visibledigits.h" | |
37 | |
38 struct NumberFormat2Test_Attributes { | |
39 int32_t id; | |
40 int32_t spos; | |
41 int32_t epos; | |
42 }; | |
43 | |
44 class NumberFormat2Test_FieldPositionHandler : public FieldPositionHandler { | |
45 public: | |
46 NumberFormat2Test_Attributes attributes[100]; | |
47 int32_t count; | |
48 UBool bRecording; | |
49 | |
50 | |
51 | |
52 NumberFormat2Test_FieldPositionHandler() : count(0), bRecording(TRUE) { attribut
es[0].spos = -1; } | |
53 NumberFormat2Test_FieldPositionHandler(UBool recording) : count(0), bRecording(r
ecording) { attributes[0].spos = -1; } | |
54 virtual ~NumberFormat2Test_FieldPositionHandler(); | |
55 virtual void addAttribute(int32_t id, int32_t start, int32_t limit); | |
56 virtual void shiftLast(int32_t delta); | |
57 virtual UBool isRecording(void) const; | |
58 }; | |
59 | |
60 NumberFormat2Test_FieldPositionHandler::~NumberFormat2Test_FieldPositionHandler(
) { | |
61 } | |
62 | |
63 void NumberFormat2Test_FieldPositionHandler::addAttribute( | |
64 int32_t id, int32_t start, int32_t limit) { | |
65 if (count == UPRV_LENGTHOF(attributes) - 1) { | |
66 return; | |
67 } | |
68 attributes[count].id = id; | |
69 attributes[count].spos = start; | |
70 attributes[count].epos = limit; | |
71 ++count; | |
72 attributes[count].spos = -1; | |
73 } | |
74 | |
75 void NumberFormat2Test_FieldPositionHandler::shiftLast(int32_t /* delta */) { | |
76 } | |
77 | |
78 UBool NumberFormat2Test_FieldPositionHandler::isRecording() const { | |
79 return bRecording; | |
80 } | |
81 | |
82 | |
83 class NumberFormat2Test : public IntlTest { | |
84 public: | |
85 void runIndexedTest(int32_t index, UBool exec, const char *&name, char *par=
0); | |
86 private: | |
87 void TestQuantize(); | |
88 void TestConvertScientificNotation(); | |
89 void TestLowerUpperExponent(); | |
90 void TestRounding(); | |
91 void TestRoundingIncrement(); | |
92 void TestDigitInterval(); | |
93 void TestGroupingUsed(); | |
94 void TestBenchmark(); | |
95 void TestBenchmark2(); | |
96 void TestSmallIntFormatter(); | |
97 void TestPositiveIntDigitFormatter(); | |
98 void TestDigitListInterval(); | |
99 void TestLargeIntValue(); | |
100 void TestIntInitVisibleDigits(); | |
101 void TestIntInitVisibleDigitsToDigitList(); | |
102 void TestDoubleInitVisibleDigits(); | |
103 void TestDoubleInitVisibleDigitsToDigitList(); | |
104 void TestDigitListInitVisibleDigits(); | |
105 void TestSpecialInitVisibleDigits(); | |
106 void TestVisibleDigitsWithExponent(); | |
107 void TestDigitAffixesAndPadding(); | |
108 void TestPluralsAndRounding(); | |
109 void TestPluralsAndRoundingScientific(); | |
110 void TestValueFormatterIsFastFormattable(); | |
111 void TestCurrencyAffixInfo(); | |
112 void TestAffixPattern(); | |
113 void TestAffixPatternAppend(); | |
114 void TestAffixPatternAppendAjoiningLiterals(); | |
115 void TestAffixPatternDoubleQuote(); | |
116 void TestAffixPatternParser(); | |
117 void TestPluralAffix(); | |
118 void TestDigitAffix(); | |
119 void TestDigitFormatterDefaultCtor(); | |
120 void TestDigitFormatterMonetary(); | |
121 void TestDigitFormatter(); | |
122 void TestSciFormatterDefaultCtor(); | |
123 void TestSciFormatter(); | |
124 void TestToPatternScientific11648(); | |
125 void verifyInterval(const DigitInterval &, int32_t minInclusive, int32_t max
Exclusive); | |
126 void verifyAffix( | |
127 const UnicodeString &expected, | |
128 const DigitAffix &affix, | |
129 const NumberFormat2Test_Attributes *expectedAttributes); | |
130 void verifyAffixesAndPadding( | |
131 const UnicodeString &expected, | |
132 const DigitAffixesAndPadding &aaf, | |
133 DigitList &digits, | |
134 const ValueFormatter &vf, | |
135 const PluralRules *optPluralRules, | |
136 const NumberFormat2Test_Attributes *expectedAttributes); | |
137 void verifyAffixesAndPaddingInt32( | |
138 const UnicodeString &expected, | |
139 const DigitAffixesAndPadding &aaf, | |
140 int32_t value, | |
141 const ValueFormatter &vf, | |
142 const PluralRules *optPluralRules, | |
143 const NumberFormat2Test_Attributes *expectedAttributes); | |
144 void verifyDigitList( | |
145 const UnicodeString &expected, | |
146 const DigitList &digits); | |
147 void verifyVisibleDigits( | |
148 const UnicodeString &expected, | |
149 UBool bNegative, | |
150 const VisibleDigits &digits); | |
151 void verifyVisibleDigitsWithExponent( | |
152 const UnicodeString &expected, | |
153 UBool bNegative, | |
154 const VisibleDigitsWithExponent &digits); | |
155 void verifyDigitFormatter( | |
156 const UnicodeString &expected, | |
157 const DigitFormatter &formatter, | |
158 const VisibleDigits &digits, | |
159 const DigitGrouping &grouping, | |
160 const DigitFormatterOptions &options, | |
161 const NumberFormat2Test_Attributes *expectedAttributes); | |
162 void verifySciFormatter( | |
163 const UnicodeString &expected, | |
164 const DigitFormatter &formatter, | |
165 const VisibleDigitsWithExponent &digits, | |
166 const SciFormatterOptions &options, | |
167 const NumberFormat2Test_Attributes *expectedAttributes); | |
168 void verifySmallIntFormatter( | |
169 const UnicodeString &expected, | |
170 int32_t positiveValue, | |
171 int32_t minDigits, | |
172 int32_t maxDigits); | |
173 void verifyPositiveIntDigitFormatter( | |
174 const UnicodeString &expected, | |
175 const DigitFormatter &formatter, | |
176 int32_t value, | |
177 int32_t minDigits, | |
178 int32_t maxDigits, | |
179 const NumberFormat2Test_Attributes *expectedAttributes); | |
180 void verifyAttributes( | |
181 const NumberFormat2Test_Attributes *expected, | |
182 const NumberFormat2Test_Attributes *actual); | |
183 void verifyIntValue( | |
184 int64_t expected, const VisibleDigits &digits); | |
185 void verifySource( | |
186 double expected, const VisibleDigits &digits); | |
187 }; | |
188 | |
189 void NumberFormat2Test::runIndexedTest( | |
190 int32_t index, UBool exec, const char *&name, char *) { | |
191 if (exec) { | |
192 logln("TestSuite ScientificNumberFormatterTest: "); | |
193 } | |
194 TESTCASE_AUTO_BEGIN; | |
195 TESTCASE_AUTO(TestQuantize); | |
196 TESTCASE_AUTO(TestConvertScientificNotation); | |
197 TESTCASE_AUTO(TestLowerUpperExponent); | |
198 TESTCASE_AUTO(TestRounding); | |
199 TESTCASE_AUTO(TestRoundingIncrement); | |
200 TESTCASE_AUTO(TestDigitInterval); | |
201 TESTCASE_AUTO(TestGroupingUsed); | |
202 TESTCASE_AUTO(TestDigitListInterval); | |
203 TESTCASE_AUTO(TestDigitFormatterDefaultCtor); | |
204 TESTCASE_AUTO(TestDigitFormatterMonetary); | |
205 TESTCASE_AUTO(TestDigitFormatter); | |
206 TESTCASE_AUTO(TestSciFormatterDefaultCtor); | |
207 TESTCASE_AUTO(TestSciFormatter); | |
208 TESTCASE_AUTO(TestBenchmark); | |
209 TESTCASE_AUTO(TestBenchmark2); | |
210 TESTCASE_AUTO(TestSmallIntFormatter); | |
211 TESTCASE_AUTO(TestPositiveIntDigitFormatter); | |
212 TESTCASE_AUTO(TestCurrencyAffixInfo); | |
213 TESTCASE_AUTO(TestAffixPattern); | |
214 TESTCASE_AUTO(TestAffixPatternAppend); | |
215 TESTCASE_AUTO(TestAffixPatternAppendAjoiningLiterals); | |
216 TESTCASE_AUTO(TestAffixPatternDoubleQuote); | |
217 TESTCASE_AUTO(TestAffixPatternParser); | |
218 TESTCASE_AUTO(TestPluralAffix); | |
219 TESTCASE_AUTO(TestDigitAffix); | |
220 TESTCASE_AUTO(TestValueFormatterIsFastFormattable); | |
221 TESTCASE_AUTO(TestLargeIntValue); | |
222 TESTCASE_AUTO(TestIntInitVisibleDigits); | |
223 TESTCASE_AUTO(TestIntInitVisibleDigitsToDigitList); | |
224 TESTCASE_AUTO(TestDoubleInitVisibleDigits); | |
225 TESTCASE_AUTO(TestDoubleInitVisibleDigitsToDigitList); | |
226 TESTCASE_AUTO(TestDigitListInitVisibleDigits); | |
227 TESTCASE_AUTO(TestSpecialInitVisibleDigits); | |
228 TESTCASE_AUTO(TestVisibleDigitsWithExponent); | |
229 TESTCASE_AUTO(TestDigitAffixesAndPadding); | |
230 TESTCASE_AUTO(TestPluralsAndRounding); | |
231 TESTCASE_AUTO(TestPluralsAndRoundingScientific); | |
232 TESTCASE_AUTO(TestToPatternScientific11648); | |
233 | |
234 TESTCASE_AUTO_END; | |
235 } | |
236 | |
237 void NumberFormat2Test::TestDigitInterval() { | |
238 DigitInterval all; | |
239 DigitInterval threeInts; | |
240 DigitInterval fourFrac; | |
241 threeInts.setIntDigitCount(3); | |
242 fourFrac.setFracDigitCount(4); | |
243 verifyInterval(all, INT32_MIN, INT32_MAX); | |
244 verifyInterval(threeInts, INT32_MIN, 3); | |
245 verifyInterval(fourFrac, -4, INT32_MAX); | |
246 { | |
247 DigitInterval result(threeInts); | |
248 result.shrinkToFitWithin(fourFrac); | |
249 verifyInterval(result, -4, 3); | |
250 assertEquals("", 7, result.length()); | |
251 } | |
252 { | |
253 DigitInterval result(threeInts); | |
254 result.expandToContain(fourFrac); | |
255 verifyInterval(result, INT32_MIN, INT32_MAX); | |
256 } | |
257 { | |
258 DigitInterval result(threeInts); | |
259 result.setIntDigitCount(0); | |
260 verifyInterval(result, INT32_MIN, 0); | |
261 result.setIntDigitCount(-1); | |
262 verifyInterval(result, INT32_MIN, INT32_MAX); | |
263 } | |
264 { | |
265 DigitInterval result(fourFrac); | |
266 result.setFracDigitCount(0); | |
267 verifyInterval(result, 0, INT32_MAX); | |
268 result.setFracDigitCount(-1); | |
269 verifyInterval(result, INT32_MIN, INT32_MAX); | |
270 } | |
271 { | |
272 DigitInterval result; | |
273 result.setIntDigitCount(3); | |
274 result.setFracDigitCount(1); | |
275 result.expandToContainDigit(0); | |
276 result.expandToContainDigit(-1); | |
277 result.expandToContainDigit(2); | |
278 verifyInterval(result, -1, 3); | |
279 result.expandToContainDigit(3); | |
280 verifyInterval(result, -1, 4); | |
281 result.expandToContainDigit(-2); | |
282 verifyInterval(result, -2, 4); | |
283 result.expandToContainDigit(15); | |
284 result.expandToContainDigit(-15); | |
285 verifyInterval(result, -15, 16); | |
286 } | |
287 { | |
288 DigitInterval result; | |
289 result.setIntDigitCount(3); | |
290 result.setFracDigitCount(1); | |
291 assertTrue("", result.contains(2)); | |
292 assertTrue("", result.contains(-1)); | |
293 assertFalse("", result.contains(3)); | |
294 assertFalse("", result.contains(-2)); | |
295 } | |
296 } | |
297 | |
298 void NumberFormat2Test::verifyInterval( | |
299 const DigitInterval &interval, | |
300 int32_t minInclusive, int32_t maxExclusive) { | |
301 assertEquals("", minInclusive, interval.getLeastSignificantInclusive()); | |
302 assertEquals("", maxExclusive, interval.getMostSignificantExclusive()); | |
303 assertEquals("", maxExclusive, interval.getIntDigitCount()); | |
304 } | |
305 | |
306 void NumberFormat2Test::TestGroupingUsed() { | |
307 { | |
308 DigitGrouping grouping; | |
309 assertFalse("", grouping.isGroupingUsed()); | |
310 } | |
311 { | |
312 DigitGrouping grouping; | |
313 grouping.fGrouping = 2; | |
314 assertTrue("", grouping.isGroupingUsed()); | |
315 } | |
316 } | |
317 | |
318 void NumberFormat2Test::TestDigitListInterval() { | |
319 DigitInterval result; | |
320 DigitList digitList; | |
321 { | |
322 digitList.set(12345); | |
323 verifyInterval(digitList.getSmallestInterval(result), 0, 5); | |
324 } | |
325 { | |
326 digitList.set(1000.00); | |
327 verifyInterval(digitList.getSmallestInterval(result), 0, 4); | |
328 } | |
329 { | |
330 digitList.set(43.125); | |
331 verifyInterval(digitList.getSmallestInterval(result), -3, 2); | |
332 } | |
333 { | |
334 digitList.set(.0078125); | |
335 verifyInterval(digitList.getSmallestInterval(result), -7, 0); | |
336 } | |
337 { | |
338 digitList.set(1000.00); | |
339 digitList.getSmallestInterval(result); | |
340 result.expandToContainDigit(3); | |
341 verifyInterval(result, 0, 4); | |
342 } | |
343 { | |
344 digitList.set(1000.00); | |
345 digitList.getSmallestInterval(result); | |
346 result.expandToContainDigit(4); | |
347 verifyInterval(result, 0, 5); | |
348 } | |
349 { | |
350 digitList.set(1000.00); | |
351 digitList.getSmallestInterval(result); | |
352 result.expandToContainDigit(0); | |
353 verifyInterval(result, 0, 4); | |
354 } | |
355 { | |
356 digitList.set(1000.00); | |
357 digitList.getSmallestInterval(result); | |
358 result.expandToContainDigit(-1); | |
359 verifyInterval(result, -1, 4); | |
360 } | |
361 { | |
362 digitList.set(43.125); | |
363 digitList.getSmallestInterval(result); | |
364 result.expandToContainDigit(1); | |
365 verifyInterval(result, -3, 2); | |
366 } | |
367 { | |
368 digitList.set(43.125); | |
369 digitList.getSmallestInterval(result); | |
370 result.expandToContainDigit(2); | |
371 verifyInterval(result, -3, 3); | |
372 } | |
373 { | |
374 digitList.set(43.125); | |
375 digitList.getSmallestInterval(result); | |
376 result.expandToContainDigit(-3); | |
377 verifyInterval(result, -3, 2); | |
378 } | |
379 { | |
380 digitList.set(43.125); | |
381 digitList.getSmallestInterval(result); | |
382 result.expandToContainDigit(-4); | |
383 verifyInterval(result, -4, 2); | |
384 } | |
385 } | |
386 | |
387 void NumberFormat2Test::TestQuantize() { | |
388 DigitList quantity; | |
389 quantity.set(0.00168); | |
390 quantity.roundAtExponent(-5); | |
391 DigitList digits; | |
392 UErrorCode status = U_ZERO_ERROR; | |
393 { | |
394 digits.set(1); | |
395 digits.quantize(quantity, status); | |
396 verifyDigitList(".9996", digits); | |
397 } | |
398 { | |
399 // round half even up | |
400 digits.set(1.00044); | |
401 digits.roundAtExponent(-5); | |
402 digits.quantize(quantity, status); | |
403 verifyDigitList("1.00128", digits); | |
404 } | |
405 { | |
406 // round half down | |
407 digits.set(0.99876); | |
408 digits.roundAtExponent(-5); | |
409 digits.quantize(quantity, status); | |
410 verifyDigitList(".99792", digits); | |
411 } | |
412 assertSuccess("", status); | |
413 } | |
414 | |
415 void NumberFormat2Test::TestConvertScientificNotation() { | |
416 DigitList digits; | |
417 { | |
418 digits.set(186283); | |
419 assertEquals("", 5, digits.toScientific(1, 1)); | |
420 verifyDigitList( | |
421 "1.86283", | |
422 digits); | |
423 } | |
424 { | |
425 digits.set(186283); | |
426 assertEquals("", 0, digits.toScientific(6, 1)); | |
427 verifyDigitList( | |
428 "186283", | |
429 digits); | |
430 } | |
431 { | |
432 digits.set(186283); | |
433 assertEquals("", -2, digits.toScientific(8, 1)); | |
434 verifyDigitList( | |
435 "18628300", | |
436 digits); | |
437 } | |
438 { | |
439 digits.set(43561); | |
440 assertEquals("", 6, digits.toScientific(-1, 3)); | |
441 verifyDigitList( | |
442 ".043561", | |
443 digits); | |
444 } | |
445 { | |
446 digits.set(43561); | |
447 assertEquals("", 3, digits.toScientific(0, 3)); | |
448 verifyDigitList( | |
449 "43.561", | |
450 digits); | |
451 } | |
452 { | |
453 digits.set(43561); | |
454 assertEquals("", 3, digits.toScientific(2, 3)); | |
455 verifyDigitList( | |
456 "43.561", | |
457 digits); | |
458 } | |
459 { | |
460 digits.set(43561); | |
461 assertEquals("", 0, digits.toScientific(3, 3)); | |
462 verifyDigitList( | |
463 "43561", | |
464 digits); | |
465 } | |
466 { | |
467 digits.set(43561); | |
468 assertEquals("", 0, digits.toScientific(5, 3)); | |
469 verifyDigitList( | |
470 "43561", | |
471 digits); | |
472 } | |
473 { | |
474 digits.set(43561); | |
475 assertEquals("", -3, digits.toScientific(6, 3)); | |
476 verifyDigitList( | |
477 "43561000", | |
478 digits); | |
479 } | |
480 { | |
481 digits.set(43561); | |
482 assertEquals("", -3, digits.toScientific(8, 3)); | |
483 verifyDigitList( | |
484 "43561000", | |
485 digits); | |
486 } | |
487 { | |
488 digits.set(43561); | |
489 assertEquals("", -6, digits.toScientific(9, 3)); | |
490 verifyDigitList( | |
491 "43561000000", | |
492 digits); | |
493 } | |
494 } | |
495 | |
496 void NumberFormat2Test::TestLowerUpperExponent() { | |
497 DigitList digits; | |
498 | |
499 digits.set(98.7); | |
500 assertEquals("", -1, digits.getLowerExponent()); | |
501 assertEquals("", 2, digits.getUpperExponent()); | |
502 } | |
503 | |
504 void NumberFormat2Test::TestRounding() { | |
505 DigitList digits; | |
506 uprv_decContextSetRounding(&digits.fContext, DEC_ROUND_CEILING); | |
507 { | |
508 // Round at very large exponent | |
509 digits.set(789.123); | |
510 digits.roundAtExponent(100); | |
511 verifyDigitList( | |
512 "100000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000", // 100 0's after 1 | |
513 digits); | |
514 } | |
515 { | |
516 // Round at very large exponent | |
517 digits.set(789.123); | |
518 digits.roundAtExponent(1); | |
519 verifyDigitList( | |
520 "790", // 100 0's after 1 | |
521 digits); | |
522 } | |
523 { | |
524 // Round at positive exponent | |
525 digits.set(789.123); | |
526 digits.roundAtExponent(1); | |
527 verifyDigitList("790", digits); | |
528 } | |
529 { | |
530 // Round at zero exponent | |
531 digits.set(788.123); | |
532 digits.roundAtExponent(0); | |
533 verifyDigitList("789", digits); | |
534 } | |
535 { | |
536 // Round at negative exponent | |
537 digits.set(789.123); | |
538 digits.roundAtExponent(-2); | |
539 verifyDigitList("789.13", digits); | |
540 } | |
541 { | |
542 // Round to exponent of digits. | |
543 digits.set(789.123); | |
544 digits.roundAtExponent(-3); | |
545 verifyDigitList("789.123", digits); | |
546 } | |
547 { | |
548 // Round at large negative exponent | |
549 digits.set(789.123); | |
550 digits.roundAtExponent(-100); | |
551 verifyDigitList("789.123", digits); | |
552 } | |
553 { | |
554 // Round negative | |
555 digits.set(-789.123); | |
556 digits.roundAtExponent(-2); | |
557 digits.setPositive(TRUE); | |
558 verifyDigitList("789.12", digits); | |
559 } | |
560 { | |
561 // Round to 1 significant digit | |
562 digits.set(789.123); | |
563 digits.roundAtExponent(INT32_MIN, 1); | |
564 verifyDigitList("800", digits); | |
565 } | |
566 { | |
567 // Round to 5 significant digit | |
568 digits.set(789.123); | |
569 digits.roundAtExponent(INT32_MIN, 5); | |
570 verifyDigitList("789.13", digits); | |
571 } | |
572 { | |
573 // Round to 6 significant digit | |
574 digits.set(789.123); | |
575 digits.roundAtExponent(INT32_MIN, 6); | |
576 verifyDigitList("789.123", digits); | |
577 } | |
578 { | |
579 // no-op | |
580 digits.set(789.123); | |
581 digits.roundAtExponent(INT32_MIN, INT32_MAX); | |
582 verifyDigitList("789.123", digits); | |
583 } | |
584 { | |
585 // Rounding at -1 produces fewer than 5 significant digits | |
586 digits.set(789.123); | |
587 digits.roundAtExponent(-1, 5); | |
588 verifyDigitList("789.2", digits); | |
589 } | |
590 { | |
591 // Rounding at -1 produces exactly 4 significant digits | |
592 digits.set(789.123); | |
593 digits.roundAtExponent(-1, 4); | |
594 verifyDigitList("789.2", digits); | |
595 } | |
596 { | |
597 // Rounding at -1 produces more than 3 significant digits | |
598 digits.set(788.123); | |
599 digits.roundAtExponent(-1, 3); | |
600 verifyDigitList("789", digits); | |
601 } | |
602 { | |
603 digits.set(123.456); | |
604 digits.round(INT32_MAX); | |
605 verifyDigitList("123.456", digits); | |
606 } | |
607 { | |
608 digits.set(123.456); | |
609 digits.round(1); | |
610 verifyDigitList("200", digits); | |
611 } | |
612 } | |
613 void NumberFormat2Test::TestBenchmark() { | |
614 /* | |
615 UErrorCode status = U_ZERO_ERROR; | |
616 Locale en("en"); | |
617 DecimalFormatSymbols *sym = new DecimalFormatSymbols(en, status); | |
618 DecimalFormat2 fmt(en, "0.0000000", status); | |
619 FieldPosition fpos(0); | |
620 clock_t start = clock(); | |
621 for (int32_t i = 0; i < 100000; ++i) { | |
622 UParseError perror; | |
623 DecimalFormat2 fmt2("0.0000000", new DecimalFormatSymbols(*sym), perror,
status); | |
624 // UnicodeString append; | |
625 // fmt.format(4.6692016, append, fpos, status); | |
626 } | |
627 errln("Took %f", (double) (clock() - start) / CLOCKS_PER_SEC); | |
628 assertSuccess("", status); | |
629 */ | |
630 } | |
631 | |
632 void NumberFormat2Test::TestBenchmark2() { | |
633 /* | |
634 UErrorCode status = U_ZERO_ERROR; | |
635 Locale en("en"); | |
636 DecimalFormatSymbols *sym = new DecimalFormatSymbols(en, status); | |
637 DecimalFormat fmt("0.0000000", sym, status); | |
638 FieldPosition fpos(0); | |
639 clock_t start = clock(); | |
640 for (int32_t i = 0; i < 100000; ++i) { | |
641 UParseError perror; | |
642 DecimalFormat fmt("0.0000000", new DecimalFormatSymbols(*sym), perror, sta
tus); | |
643 // UnicodeString append; | |
644 // fmt.format(4.6692016, append, fpos, status); | |
645 } | |
646 errln("Took %f", (double) (clock() - start) / CLOCKS_PER_SEC); | |
647 assertSuccess("", status); | |
648 */ | |
649 } | |
650 | |
651 void NumberFormat2Test::TestSmallIntFormatter() { | |
652 verifySmallIntFormatter("0", 7, 0, -2); | |
653 verifySmallIntFormatter("7", 7, 1, -2); | |
654 verifySmallIntFormatter("07", 7, 2, -2); | |
655 verifySmallIntFormatter("07", 7, 2, 2); | |
656 verifySmallIntFormatter("007", 7, 3, 4); | |
657 verifySmallIntFormatter("7", 7, -1, 3); | |
658 verifySmallIntFormatter("0", 0, -1, 3); | |
659 verifySmallIntFormatter("057", 57, 3, 7); | |
660 verifySmallIntFormatter("0057", 57, 4, 7); | |
661 // too many digits for small int | |
662 verifySmallIntFormatter("", 57, 5, 7); | |
663 // too many digits for small int | |
664 verifySmallIntFormatter("", 57, 5, 4); | |
665 verifySmallIntFormatter("03", 3, 2, 3); | |
666 verifySmallIntFormatter("32", 32, 2, 3); | |
667 verifySmallIntFormatter("321", 321, 2, 3); | |
668 verifySmallIntFormatter("219", 3219, 2, 3); | |
669 verifySmallIntFormatter("4095", 4095, 2, 4); | |
670 verifySmallIntFormatter("4095", 4095, 2, 5); | |
671 verifySmallIntFormatter("", 4096, 2, 5); | |
672 } | |
673 | |
674 void NumberFormat2Test::TestPositiveIntDigitFormatter() { | |
675 DigitFormatter formatter; | |
676 { | |
677 NumberFormat2Test_Attributes expectedAttributes[] = { | |
678 {UNUM_INTEGER_FIELD, 0, 4}, | |
679 {0, -1, 0}}; | |
680 verifyPositiveIntDigitFormatter( | |
681 "0057", | |
682 formatter, | |
683 57, | |
684 4, | |
685 INT32_MAX, | |
686 expectedAttributes); | |
687 } | |
688 { | |
689 NumberFormat2Test_Attributes expectedAttributes[] = { | |
690 {UNUM_INTEGER_FIELD, 0, 5}, | |
691 {0, -1, 0}}; | |
692 verifyPositiveIntDigitFormatter( | |
693 "00057", | |
694 formatter, | |
695 57, | |
696 5, | |
697 INT32_MAX, | |
698 expectedAttributes); | |
699 } | |
700 { | |
701 NumberFormat2Test_Attributes expectedAttributes[] = { | |
702 {UNUM_INTEGER_FIELD, 0, 5}, | |
703 {0, -1, 0}}; | |
704 verifyPositiveIntDigitFormatter( | |
705 "01000", | |
706 formatter, | |
707 1000, | |
708 5, | |
709 INT32_MAX, | |
710 expectedAttributes); | |
711 } | |
712 { | |
713 NumberFormat2Test_Attributes expectedAttributes[] = { | |
714 {UNUM_INTEGER_FIELD, 0, 3}, | |
715 {0, -1, 0}}; | |
716 verifyPositiveIntDigitFormatter( | |
717 "100", | |
718 formatter, | |
719 100, | |
720 0, | |
721 INT32_MAX, | |
722 expectedAttributes); | |
723 } | |
724 { | |
725 NumberFormat2Test_Attributes expectedAttributes[] = { | |
726 {UNUM_INTEGER_FIELD, 0, 10}, | |
727 {0, -1, 0}}; | |
728 verifyPositiveIntDigitFormatter( | |
729 "2147483647", | |
730 formatter, | |
731 2147483647, | |
732 5, | |
733 INT32_MAX, | |
734 expectedAttributes); | |
735 } | |
736 { | |
737 NumberFormat2Test_Attributes expectedAttributes[] = { | |
738 {UNUM_INTEGER_FIELD, 0, 12}, | |
739 {0, -1, 0}}; | |
740 verifyPositiveIntDigitFormatter( | |
741 "002147483647", | |
742 formatter, | |
743 2147483647, | |
744 12, | |
745 INT32_MAX, | |
746 expectedAttributes); | |
747 } | |
748 { | |
749 // Test long digit string where we have to append one | |
750 // character at a time. | |
751 NumberFormat2Test_Attributes expectedAttributes[] = { | |
752 {UNUM_INTEGER_FIELD, 0, 40}, | |
753 {0, -1, 0}}; | |
754 verifyPositiveIntDigitFormatter( | |
755 "0000000000000000000000000000002147483647", | |
756 formatter, | |
757 2147483647, | |
758 40, | |
759 INT32_MAX, | |
760 expectedAttributes); | |
761 } | |
762 { | |
763 NumberFormat2Test_Attributes expectedAttributes[] = { | |
764 {UNUM_INTEGER_FIELD, 0, 4}, | |
765 {0, -1, 0}}; | |
766 verifyPositiveIntDigitFormatter( | |
767 "6283", | |
768 formatter, | |
769 186283, | |
770 2, | |
771 4, | |
772 expectedAttributes); | |
773 } | |
774 { | |
775 NumberFormat2Test_Attributes expectedAttributes[] = { | |
776 {UNUM_INTEGER_FIELD, 0, 1}, | |
777 {0, -1, 0}}; | |
778 verifyPositiveIntDigitFormatter( | |
779 "0", | |
780 formatter, | |
781 186283, | |
782 0, | |
783 0, | |
784 expectedAttributes); | |
785 } | |
786 { | |
787 NumberFormat2Test_Attributes expectedAttributes[] = { | |
788 {UNUM_INTEGER_FIELD, 0, 1}, | |
789 {0, -1, 0}}; | |
790 verifyPositiveIntDigitFormatter( | |
791 "3", | |
792 formatter, | |
793 186283, | |
794 1, | |
795 1, | |
796 expectedAttributes); | |
797 } | |
798 } | |
799 | |
800 | |
801 void NumberFormat2Test::TestDigitFormatterDefaultCtor() { | |
802 DigitFormatter formatter; | |
803 VisibleDigits digits; | |
804 FixedPrecision precision; | |
805 UErrorCode status = U_ZERO_ERROR; | |
806 precision.initVisibleDigits(246.801, digits, status); | |
807 assertSuccess("", status); | |
808 DigitGrouping grouping; | |
809 DigitFormatterOptions options; | |
810 verifyDigitFormatter( | |
811 "246.801", | |
812 formatter, | |
813 digits, | |
814 grouping, | |
815 options, | |
816 NULL); | |
817 } | |
818 | |
819 void NumberFormat2Test::TestDigitFormatterMonetary() { | |
820 UErrorCode status = U_ZERO_ERROR; | |
821 DecimalFormatSymbols symbols("en", status); | |
822 if (!assertSuccess("", status)) { | |
823 return; | |
824 } | |
825 symbols.setSymbol( | |
826 DecimalFormatSymbols::kMonetarySeparatorSymbol, | |
827 "decimal separator"); | |
828 symbols.setSymbol( | |
829 DecimalFormatSymbols::kMonetaryGroupingSeparatorSymbol, | |
830 "grouping separator"); | |
831 DigitFormatter formatter(symbols); | |
832 VisibleDigits visibleDigits; | |
833 DigitGrouping grouping; | |
834 FixedPrecision precision; | |
835 precision.initVisibleDigits(43560.02, visibleDigits, status); | |
836 if (!assertSuccess("", status)) { | |
837 return; | |
838 } | |
839 DigitFormatterOptions options; | |
840 grouping.fGrouping = 3; | |
841 { | |
842 verifyDigitFormatter( | |
843 "43,560.02", | |
844 formatter, | |
845 visibleDigits, | |
846 grouping, | |
847 options, | |
848 NULL); | |
849 formatter.setDecimalFormatSymbolsForMonetary(symbols); | |
850 verifyDigitFormatter( | |
851 "43grouping separator560decimal separator02", | |
852 formatter, | |
853 visibleDigits, | |
854 grouping, | |
855 options, | |
856 NULL); | |
857 } | |
858 } | |
859 | |
860 void NumberFormat2Test::TestDigitFormatter() { | |
861 UErrorCode status = U_ZERO_ERROR; | |
862 DecimalFormatSymbols symbols("en", status); | |
863 if (!assertSuccess("", status)) { | |
864 return; | |
865 } | |
866 DigitFormatter formatter(symbols); | |
867 DigitInterval interval; | |
868 { | |
869 VisibleDigits visibleDigits; | |
870 DigitGrouping grouping; | |
871 FixedPrecision precision; | |
872 precision.initVisibleDigits((int64_t) 8192, visibleDigits, status); | |
873 if (!assertSuccess("", status)) { | |
874 return; | |
875 } | |
876 DigitFormatterOptions options; | |
877 verifyDigitFormatter( | |
878 "8192", | |
879 formatter, | |
880 visibleDigits, | |
881 grouping, | |
882 options, | |
883 NULL); | |
884 NumberFormat2Test_Attributes expectedAttributes[] = { | |
885 {UNUM_INTEGER_FIELD, 0, 4}, | |
886 {UNUM_DECIMAL_SEPARATOR_FIELD, 4, 5}, | |
887 {0, -1, 0}}; | |
888 options.fAlwaysShowDecimal = TRUE; | |
889 verifyDigitFormatter( | |
890 "8192.", | |
891 formatter, | |
892 visibleDigits, | |
893 grouping, | |
894 options, | |
895 expectedAttributes); | |
896 | |
897 // Turn on grouping | |
898 grouping.fGrouping = 3; | |
899 options.fAlwaysShowDecimal = FALSE; | |
900 verifyDigitFormatter( | |
901 "8,192", | |
902 formatter, | |
903 visibleDigits, | |
904 grouping, | |
905 options, | |
906 NULL); | |
907 | |
908 // turn on min grouping which will suppress grouping | |
909 grouping.fMinGrouping = 2; | |
910 verifyDigitFormatter( | |
911 "8192", | |
912 formatter, | |
913 visibleDigits, | |
914 grouping, | |
915 options, | |
916 NULL); | |
917 | |
918 // adding one more digit will enable grouping once again. | |
919 precision.initVisibleDigits((int64_t) 43560, visibleDigits, status); | |
920 if (!assertSuccess("", status)) { | |
921 return; | |
922 } | |
923 verifyDigitFormatter( | |
924 "43,560", | |
925 formatter, | |
926 visibleDigits, | |
927 grouping, | |
928 options, | |
929 NULL); | |
930 } | |
931 { | |
932 DigitGrouping grouping; | |
933 FixedPrecision precision; | |
934 VisibleDigits visibleDigits; | |
935 precision.initVisibleDigits( | |
936 31415926.0078125, visibleDigits, status); | |
937 if (!assertSuccess("", status)) { | |
938 return; | |
939 } | |
940 DigitFormatterOptions options; | |
941 verifyDigitFormatter( | |
942 "31415926.0078125", | |
943 formatter, | |
944 visibleDigits, | |
945 grouping, | |
946 options, | |
947 NULL); | |
948 | |
949 // Turn on grouping with secondary. | |
950 grouping.fGrouping = 2; | |
951 grouping.fGrouping2 = 3; | |
952 verifyDigitFormatter( | |
953 "314,159,26.0078125", | |
954 formatter, | |
955 visibleDigits, | |
956 grouping, | |
957 options, | |
958 NULL); | |
959 | |
960 // Pad with zeros by widening interval. | |
961 precision.fMin.setIntDigitCount(9); | |
962 precision.fMin.setFracDigitCount(10); | |
963 precision.initVisibleDigits( | |
964 31415926.0078125, visibleDigits, status); | |
965 if (!assertSuccess("", status)) { | |
966 return; | |
967 } | |
968 NumberFormat2Test_Attributes expectedAttributes[] = { | |
969 {UNUM_GROUPING_SEPARATOR_FIELD, 1, 2}, | |
970 {UNUM_GROUPING_SEPARATOR_FIELD, 5, 6}, | |
971 {UNUM_GROUPING_SEPARATOR_FIELD, 9, 10}, | |
972 {UNUM_INTEGER_FIELD, 0, 12}, | |
973 {UNUM_DECIMAL_SEPARATOR_FIELD, 12, 13}, | |
974 {UNUM_FRACTION_FIELD, 13, 23}, | |
975 {0, -1, 0}}; | |
976 verifyDigitFormatter( | |
977 "0,314,159,26.0078125000", | |
978 formatter, | |
979 visibleDigits, | |
980 grouping, | |
981 options, | |
982 expectedAttributes); | |
983 } | |
984 { | |
985 DigitGrouping grouping; | |
986 FixedPrecision precision; | |
987 VisibleDigits visibleDigits; | |
988 DigitFormatterOptions options; | |
989 precision.fMax.setIntDigitCount(0); | |
990 precision.fMax.setFracDigitCount(0); | |
991 precision.initVisibleDigits( | |
992 3125.0, visibleDigits, status); | |
993 if (!assertSuccess("", status)) { | |
994 return; | |
995 } | |
996 NumberFormat2Test_Attributes expectedAttributes[] = { | |
997 {UNUM_INTEGER_FIELD, 0, 1}, | |
998 {0, -1, 0}}; | |
999 verifyDigitFormatter( | |
1000 "0", | |
1001 formatter, | |
1002 visibleDigits, | |
1003 grouping, | |
1004 options, | |
1005 expectedAttributes); | |
1006 NumberFormat2Test_Attributes expectedAttributesWithDecimal[] = { | |
1007 {UNUM_INTEGER_FIELD, 0, 1}, | |
1008 {UNUM_DECIMAL_SEPARATOR_FIELD, 1, 2}, | |
1009 {0, -1, 0}}; | |
1010 options.fAlwaysShowDecimal = TRUE; | |
1011 verifyDigitFormatter( | |
1012 "0.", | |
1013 formatter, | |
1014 visibleDigits, | |
1015 grouping, | |
1016 options, | |
1017 expectedAttributesWithDecimal); | |
1018 } | |
1019 { | |
1020 DigitGrouping grouping; | |
1021 FixedPrecision precision; | |
1022 VisibleDigits visibleDigits; | |
1023 DigitFormatterOptions options; | |
1024 precision.fMax.setIntDigitCount(1); | |
1025 precision.fMin.setFracDigitCount(1); | |
1026 precision.initVisibleDigits( | |
1027 3125.0, visibleDigits, status); | |
1028 if (!assertSuccess("", status)) { | |
1029 return; | |
1030 } | |
1031 NumberFormat2Test_Attributes expectedAttributes[] = { | |
1032 {UNUM_INTEGER_FIELD, 0, 1}, | |
1033 {UNUM_DECIMAL_SEPARATOR_FIELD, 1, 2}, | |
1034 {UNUM_FRACTION_FIELD, 2, 3}, | |
1035 {0, -1, 0}}; | |
1036 options.fAlwaysShowDecimal = TRUE; | |
1037 verifyDigitFormatter( | |
1038 "5.0", | |
1039 formatter, | |
1040 visibleDigits, | |
1041 grouping, | |
1042 options, | |
1043 expectedAttributes); | |
1044 } | |
1045 } | |
1046 | |
1047 void NumberFormat2Test::TestSciFormatterDefaultCtor() { | |
1048 DigitFormatter formatter; | |
1049 ScientificPrecision precision; | |
1050 VisibleDigitsWithExponent visibleDigits; | |
1051 UErrorCode status = U_ZERO_ERROR; | |
1052 precision.initVisibleDigitsWithExponent( | |
1053 6.02E23, visibleDigits, status); | |
1054 if (!assertSuccess("", status)) { | |
1055 return; | |
1056 } | |
1057 SciFormatterOptions options; | |
1058 verifySciFormatter( | |
1059 "6.02E23", | |
1060 formatter, | |
1061 visibleDigits, | |
1062 options, | |
1063 NULL); | |
1064 precision.initVisibleDigitsWithExponent( | |
1065 6.62E-34, visibleDigits, status); | |
1066 if (!assertSuccess("", status)) { | |
1067 return; | |
1068 } | |
1069 verifySciFormatter( | |
1070 "6.62E-34", | |
1071 formatter, | |
1072 visibleDigits, | |
1073 options, | |
1074 NULL); | |
1075 } | |
1076 | |
1077 void NumberFormat2Test::TestSciFormatter() { | |
1078 DigitFormatter formatter; | |
1079 ScientificPrecision precision; | |
1080 precision.fMantissa.fMin.setIntDigitCount(4); | |
1081 precision.fMantissa.fMax.setIntDigitCount(4); | |
1082 precision.fMantissa.fMin.setFracDigitCount(0); | |
1083 precision.fMantissa.fMax.setFracDigitCount(0); | |
1084 precision.fMinExponentDigits = 3; | |
1085 VisibleDigitsWithExponent visibleDigits; | |
1086 UErrorCode status = U_ZERO_ERROR; | |
1087 precision.initVisibleDigitsWithExponent( | |
1088 1.248E26, visibleDigits, status); | |
1089 if (!assertSuccess("", status)) { | |
1090 return; | |
1091 } | |
1092 SciFormatterOptions options; | |
1093 | |
1094 { | |
1095 options.fExponent.fAlwaysShowSign = TRUE; | |
1096 NumberFormat2Test_Attributes expectedAttributes[] = { | |
1097 {UNUM_INTEGER_FIELD, 0, 4}, | |
1098 {UNUM_EXPONENT_SYMBOL_FIELD, 4, 5}, | |
1099 {UNUM_EXPONENT_SIGN_FIELD, 5, 6}, | |
1100 {UNUM_EXPONENT_FIELD, 6, 9}, | |
1101 {0, -1, 0}}; | |
1102 verifySciFormatter( | |
1103 "1248E+023", | |
1104 formatter, | |
1105 visibleDigits, | |
1106 options, | |
1107 expectedAttributes); | |
1108 } | |
1109 { | |
1110 options.fMantissa.fAlwaysShowDecimal = TRUE; | |
1111 options.fExponent.fAlwaysShowSign = FALSE; | |
1112 NumberFormat2Test_Attributes expectedAttributes[] = { | |
1113 {UNUM_INTEGER_FIELD, 0, 4}, | |
1114 {UNUM_DECIMAL_SEPARATOR_FIELD, 4, 5}, | |
1115 {UNUM_EXPONENT_SYMBOL_FIELD, 5, 6}, | |
1116 {UNUM_EXPONENT_FIELD, 6, 9}, | |
1117 {0, -1, 0}}; | |
1118 verifySciFormatter( | |
1119 "1248.E023", | |
1120 formatter, | |
1121 visibleDigits, | |
1122 options, | |
1123 expectedAttributes); | |
1124 } | |
1125 } | |
1126 | |
1127 void NumberFormat2Test::TestValueFormatterIsFastFormattable() { | |
1128 UErrorCode status = U_ZERO_ERROR; | |
1129 DecimalFormatSymbols symbols("en", status); | |
1130 if (!assertSuccess("", status)) { | |
1131 return; | |
1132 } | |
1133 DigitFormatter formatter(symbols); | |
1134 DigitGrouping grouping; | |
1135 FixedPrecision precision; | |
1136 DigitFormatterOptions options; | |
1137 ValueFormatter vf; | |
1138 vf.prepareFixedDecimalFormatting( | |
1139 formatter, grouping, precision, options); | |
1140 assertTrue("", vf.isFastFormattable(0)); | |
1141 assertTrue("", vf.isFastFormattable(35)); | |
1142 assertTrue("", vf.isFastFormattable(-48)); | |
1143 assertTrue("", vf.isFastFormattable(2147483647)); | |
1144 assertTrue("", vf.isFastFormattable(-2147483647)); | |
1145 assertFalse("", vf.isFastFormattable(-2147483648L)); | |
1146 { | |
1147 DigitGrouping grouping; | |
1148 grouping.fGrouping = 3; | |
1149 ValueFormatter vf; | |
1150 vf.prepareFixedDecimalFormatting( | |
1151 formatter, grouping, precision, options); | |
1152 assertTrue("0", vf.isFastFormattable(0)); | |
1153 assertTrue("62", vf.isFastFormattable(62)); | |
1154 assertTrue("999", vf.isFastFormattable(999)); | |
1155 assertFalse("1000", vf.isFastFormattable(1000)); | |
1156 assertTrue("-1", vf.isFastFormattable(-1)); | |
1157 assertTrue("-38", vf.isFastFormattable(-38)); | |
1158 assertTrue("-999", vf.isFastFormattable(-999)); | |
1159 assertFalse("-1000", vf.isFastFormattable(-1000)); | |
1160 grouping.fMinGrouping = 2; | |
1161 assertTrue("-1000", vf.isFastFormattable(-1000)); | |
1162 assertTrue("-4095", vf.isFastFormattable(-4095)); | |
1163 assertTrue("4095", vf.isFastFormattable(4095)); | |
1164 // We give up on acounting digits at 4096 | |
1165 assertFalse("-4096", vf.isFastFormattable(-4096)); | |
1166 assertFalse("4096", vf.isFastFormattable(4096)); | |
1167 } | |
1168 { | |
1169 // grouping on but with max integer digits set. | |
1170 DigitGrouping grouping; | |
1171 grouping.fGrouping = 4; | |
1172 FixedPrecision precision; | |
1173 precision.fMax.setIntDigitCount(4); | |
1174 ValueFormatter vf; | |
1175 vf.prepareFixedDecimalFormatting( | |
1176 formatter, grouping, precision, options); | |
1177 assertTrue("-4096", vf.isFastFormattable(-4096)); | |
1178 assertTrue("4096", vf.isFastFormattable(4096)); | |
1179 assertTrue("-10000", vf.isFastFormattable(-10000)); | |
1180 assertTrue("10000", vf.isFastFormattable(10000)); | |
1181 assertTrue("-2147483647", vf.isFastFormattable(-2147483647)); | |
1182 assertTrue("2147483647", vf.isFastFormattable(2147483647)); | |
1183 | |
1184 precision.fMax.setIntDigitCount(5); | |
1185 assertFalse("-4096", vf.isFastFormattable(-4096)); | |
1186 assertFalse("4096", vf.isFastFormattable(4096)); | |
1187 | |
1188 } | |
1189 { | |
1190 // grouping on but with min integer digits set. | |
1191 DigitGrouping grouping; | |
1192 grouping.fGrouping = 3; | |
1193 FixedPrecision precision; | |
1194 precision.fMin.setIntDigitCount(3); | |
1195 ValueFormatter vf; | |
1196 vf.prepareFixedDecimalFormatting( | |
1197 formatter, grouping, precision, options); | |
1198 assertTrue("-999", vf.isFastFormattable(-999)); | |
1199 assertTrue("999", vf.isFastFormattable(999)); | |
1200 assertFalse("-1000", vf.isFastFormattable(-1000)); | |
1201 assertFalse("1000", vf.isFastFormattable(1000)); | |
1202 | |
1203 precision.fMin.setIntDigitCount(4); | |
1204 assertFalse("-999", vf.isFastFormattable(-999)); | |
1205 assertFalse("999", vf.isFastFormattable(999)); | |
1206 assertFalse("-2147483647", vf.isFastFormattable(-2147483647)); | |
1207 assertFalse("2147483647", vf.isFastFormattable(2147483647)); | |
1208 } | |
1209 { | |
1210 // options set. | |
1211 DigitFormatterOptions options; | |
1212 ValueFormatter vf; | |
1213 vf.prepareFixedDecimalFormatting( | |
1214 formatter, grouping, precision, options); | |
1215 assertTrue("5125", vf.isFastFormattable(5125)); | |
1216 options.fAlwaysShowDecimal = TRUE; | |
1217 assertFalse("5125", vf.isFastFormattable(5125)); | |
1218 options.fAlwaysShowDecimal = FALSE; | |
1219 assertTrue("5125", vf.isFastFormattable(5125)); | |
1220 } | |
1221 { | |
1222 // test fraction digits | |
1223 FixedPrecision precision; | |
1224 ValueFormatter vf; | |
1225 vf.prepareFixedDecimalFormatting( | |
1226 formatter, grouping, precision, options); | |
1227 assertTrue("7127", vf.isFastFormattable(7127)); | |
1228 precision.fMin.setFracDigitCount(1); | |
1229 assertFalse("7127", vf.isFastFormattable(7127)); | |
1230 } | |
1231 { | |
1232 // test presence of significant digits | |
1233 FixedPrecision precision; | |
1234 ValueFormatter vf; | |
1235 vf.prepareFixedDecimalFormatting( | |
1236 formatter, grouping, precision, options); | |
1237 assertTrue("1049", vf.isFastFormattable(1049)); | |
1238 precision.fSignificant.setMin(1); | |
1239 assertFalse("1049", vf.isFastFormattable(1049)); | |
1240 } | |
1241 { | |
1242 // test presence of rounding increment | |
1243 FixedPrecision precision; | |
1244 ValueFormatter vf; | |
1245 vf.prepareFixedDecimalFormatting( | |
1246 formatter, grouping, precision, options); | |
1247 assertTrue("1099", vf.isFastFormattable(1099)); | |
1248 precision.fRoundingIncrement.set(2.3); | |
1249 assertFalse("1099", vf.isFastFormattable(1099)); | |
1250 } | |
1251 { | |
1252 // test scientific notation | |
1253 ScientificPrecision precision; | |
1254 SciFormatterOptions options; | |
1255 ValueFormatter vf; | |
1256 vf.prepareScientificFormatting( | |
1257 formatter, precision, options); | |
1258 assertFalse("1081", vf.isFastFormattable(1081)); | |
1259 } | |
1260 } | |
1261 | |
1262 void NumberFormat2Test::TestDigitAffix() { | |
1263 DigitAffix affix; | |
1264 { | |
1265 affix.append("foo"); | |
1266 affix.append("--", UNUM_SIGN_FIELD); | |
1267 affix.append("%", UNUM_PERCENT_FIELD); | |
1268 NumberFormat2Test_Attributes expectedAttributes[] = { | |
1269 {UNUM_SIGN_FIELD, 3, 5}, | |
1270 {UNUM_PERCENT_FIELD, 5, 6}, | |
1271 {0, -1, 0}}; | |
1272 verifyAffix("foo--%", affix, expectedAttributes); | |
1273 } | |
1274 { | |
1275 affix.remove(); | |
1276 affix.append("USD", UNUM_CURRENCY_FIELD); | |
1277 affix.append(" "); | |
1278 NumberFormat2Test_Attributes expectedAttributes[] = { | |
1279 {UNUM_CURRENCY_FIELD, 0, 3}, | |
1280 {0, -1, 0}}; | |
1281 verifyAffix("USD ", affix, expectedAttributes); | |
1282 } | |
1283 { | |
1284 affix.setTo("%%", UNUM_PERCENT_FIELD); | |
1285 NumberFormat2Test_Attributes expectedAttributes[] = { | |
1286 {UNUM_PERCENT_FIELD, 0, 2}, | |
1287 {0, -1, 0}}; | |
1288 verifyAffix("%%", affix, expectedAttributes); | |
1289 } | |
1290 } | |
1291 | |
1292 void NumberFormat2Test::TestPluralAffix() { | |
1293 UErrorCode status = U_ZERO_ERROR; | |
1294 PluralAffix part; | |
1295 part.setVariant("one", "Dollar", status); | |
1296 part.setVariant("few", "DollarFew", status); | |
1297 part.setVariant("other", "Dollars", status); | |
1298 PluralAffix dollar(part); | |
1299 PluralAffix percent(part); | |
1300 part.remove(); | |
1301 part.setVariant("one", "Percent", status); | |
1302 part.setVariant("many", "PercentMany", status); | |
1303 part.setVariant("other", "Percents", status); | |
1304 percent = part; | |
1305 part.remove(); | |
1306 part.setVariant("one", "foo", status); | |
1307 | |
1308 PluralAffix pa; | |
1309 assertEquals("", "", pa.getOtherVariant().toString()); | |
1310 pa.append(dollar, UNUM_CURRENCY_FIELD, status); | |
1311 pa.append(" and "); | |
1312 pa.append(percent, UNUM_PERCENT_FIELD, status); | |
1313 pa.append("-", UNUM_SIGN_FIELD); | |
1314 | |
1315 { | |
1316 // other | |
1317 NumberFormat2Test_Attributes expectedAttributes[] = { | |
1318 {UNUM_CURRENCY_FIELD, 0, 7}, | |
1319 {UNUM_PERCENT_FIELD, 12, 20}, | |
1320 {UNUM_SIGN_FIELD, 20, 21}, | |
1321 {0, -1, 0}}; | |
1322 verifyAffix( | |
1323 "Dollars and Percents-", | |
1324 pa.getByCategory("other"), | |
1325 expectedAttributes); | |
1326 } | |
1327 { | |
1328 // two which is same as other | |
1329 NumberFormat2Test_Attributes expectedAttributes[] = { | |
1330 {UNUM_CURRENCY_FIELD, 0, 7}, | |
1331 {UNUM_PERCENT_FIELD, 12, 20}, | |
1332 {UNUM_SIGN_FIELD, 20, 21}, | |
1333 {0, -1, 0}}; | |
1334 verifyAffix( | |
1335 "Dollars and Percents-", | |
1336 pa.getByCategory("two"), | |
1337 expectedAttributes); | |
1338 } | |
1339 { | |
1340 // bad which is same as other | |
1341 NumberFormat2Test_Attributes expectedAttributes[] = { | |
1342 {UNUM_CURRENCY_FIELD, 0, 7}, | |
1343 {UNUM_PERCENT_FIELD, 12, 20}, | |
1344 {UNUM_SIGN_FIELD, 20, 21}, | |
1345 {0, -1, 0}}; | |
1346 verifyAffix( | |
1347 "Dollars and Percents-", | |
1348 pa.getByCategory("bad"), | |
1349 expectedAttributes); | |
1350 } | |
1351 { | |
1352 // one | |
1353 NumberFormat2Test_Attributes expectedAttributes[] = { | |
1354 {UNUM_CURRENCY_FIELD, 0, 6}, | |
1355 {UNUM_PERCENT_FIELD, 11, 18}, | |
1356 {UNUM_SIGN_FIELD, 18, 19}, | |
1357 {0, -1, 0}}; | |
1358 verifyAffix( | |
1359 "Dollar and Percent-", | |
1360 pa.getByCategory("one"), | |
1361 expectedAttributes); | |
1362 } | |
1363 { | |
1364 // few | |
1365 NumberFormat2Test_Attributes expectedAttributes[] = { | |
1366 {UNUM_CURRENCY_FIELD, 0, 9}, | |
1367 {UNUM_PERCENT_FIELD, 14, 22}, | |
1368 {UNUM_SIGN_FIELD, 22, 23}, | |
1369 {0, -1, 0}}; | |
1370 verifyAffix( | |
1371 "DollarFew and Percents-", | |
1372 pa.getByCategory("few"), | |
1373 expectedAttributes); | |
1374 } | |
1375 { | |
1376 // many | |
1377 NumberFormat2Test_Attributes expectedAttributes[] = { | |
1378 {UNUM_CURRENCY_FIELD, 0, 7}, | |
1379 {UNUM_PERCENT_FIELD, 12, 23}, | |
1380 {UNUM_SIGN_FIELD, 23, 24}, | |
1381 {0, -1, 0}}; | |
1382 verifyAffix( | |
1383 "Dollars and PercentMany-", | |
1384 pa.getByCategory("many"), | |
1385 expectedAttributes); | |
1386 } | |
1387 assertTrue("", pa.hasMultipleVariants()); | |
1388 pa.remove(); | |
1389 pa.append("$$$", UNUM_CURRENCY_FIELD); | |
1390 assertFalse("", pa.hasMultipleVariants()); | |
1391 | |
1392 } | |
1393 | |
1394 void NumberFormat2Test::TestCurrencyAffixInfo() { | |
1395 CurrencyAffixInfo info; | |
1396 assertTrue("", info.isDefault()); | |
1397 UnicodeString expectedSymbol("\\u00a4"); | |
1398 UnicodeString expectedSymbolIso("\\u00a4\\u00a4"); | |
1399 UnicodeString expectedSymbols("\\u00a4\\u00a4\\u00a4"); | |
1400 assertEquals("", expectedSymbol.unescape(), info.getSymbol()); | |
1401 assertEquals("", expectedSymbolIso.unescape(), info.getISO()); | |
1402 assertEquals("", expectedSymbols.unescape(), info.getLong().getByCategory("o
ne").toString()); | |
1403 assertEquals("", expectedSymbols.unescape(), info.getLong().getByCategory("o
ther").toString()); | |
1404 assertEquals("", expectedSymbols.unescape(), info.getLong().getByCategory("t
wo").toString()); | |
1405 UErrorCode status = U_ZERO_ERROR; | |
1406 static UChar USD[] = {0x55, 0x53, 0x44, 0x0}; | |
1407 LocalPointer<PluralRules> rules(PluralRules::forLocale("en", status)); | |
1408 if (!assertSuccess("", status)) { | |
1409 return; | |
1410 } | |
1411 info.set("en", rules.getAlias(), USD, status); | |
1412 assertEquals("", "$", info.getSymbol(), TRUE); | |
1413 assertEquals("", "USD", info.getISO(), TRUE); | |
1414 assertEquals("", "US dollar", info.getLong().getByCategory("one").toString()
, TRUE); | |
1415 assertEquals("", "US dollars", info.getLong().getByCategory("other").toStrin
g(), TRUE); | |
1416 assertEquals("", "US dollars", info.getLong().getByCategory("two").toString(
), TRUE); | |
1417 assertFalse("", info.isDefault()); | |
1418 info.set(NULL, NULL, NULL, status); | |
1419 assertTrue("", info.isDefault()); | |
1420 assertEquals("", expectedSymbol.unescape(), info.getSymbol()); | |
1421 assertEquals("", expectedSymbolIso.unescape(), info.getISO()); | |
1422 assertEquals("", expectedSymbols.unescape(), info.getLong().getByCategory("o
ne").toString()); | |
1423 assertEquals("", expectedSymbols.unescape(), info.getLong().getByCategory("o
ther").toString()); | |
1424 assertEquals("", expectedSymbols.unescape(), info.getLong().getByCategory("t
wo").toString()); | |
1425 info.setSymbol("$"); | |
1426 assertFalse("", info.isDefault()); | |
1427 info.set(NULL, NULL, NULL, status); | |
1428 assertTrue("", info.isDefault()); | |
1429 info.setISO("USD"); | |
1430 assertFalse("", info.isDefault()); | |
1431 assertSuccess("", status); | |
1432 } | |
1433 | |
1434 void NumberFormat2Test::TestAffixPattern() { | |
1435 static UChar chars[500]; | |
1436 for (int32_t i = 0; i < UPRV_LENGTHOF(chars); ++i) { | |
1437 chars[i] = (UChar) (i + 1); | |
1438 } | |
1439 AffixPattern first; | |
1440 first.add(AffixPattern::kPercent); | |
1441 first.addLiteral(chars, 0, 200); | |
1442 first.addLiteral(chars, 200, 300); | |
1443 first.addCurrency(2); | |
1444 first.addLiteral(chars, 0, 256); | |
1445 AffixPattern second; | |
1446 second.add(AffixPattern::kPercent); | |
1447 second.addLiteral(chars, 0, 300); | |
1448 second.addLiteral(chars, 300, 200); | |
1449 second.addCurrency(2); | |
1450 second.addLiteral(chars, 0, 150); | |
1451 second.addLiteral(chars, 150, 106); | |
1452 assertTrue("", first.equals(second)); | |
1453 AffixPatternIterator iter; | |
1454 second.remove(); | |
1455 assertFalse("", second.iterator(iter).nextToken()); | |
1456 assertTrue("", first.iterator(iter).nextToken()); | |
1457 assertEquals("", AffixPattern::kPercent, iter.getTokenType()); | |
1458 assertEquals("", 1, iter.getTokenLength()); | |
1459 assertTrue("", iter.nextToken()); | |
1460 UnicodeString str; | |
1461 assertEquals("", 500, iter.getLiteral(str).length()); | |
1462 assertEquals("", AffixPattern::kLiteral, iter.getTokenType()); | |
1463 assertEquals("", 500, iter.getTokenLength()); | |
1464 assertTrue("", iter.nextToken()); | |
1465 assertEquals("", AffixPattern::kCurrency, iter.getTokenType()); | |
1466 assertEquals("", 2, iter.getTokenLength()); | |
1467 assertTrue("", iter.nextToken()); | |
1468 assertEquals("", 256, iter.getLiteral(str).length()); | |
1469 assertEquals("", AffixPattern::kLiteral, iter.getTokenType()); | |
1470 assertEquals("", 256, iter.getTokenLength()); | |
1471 assertFalse("", iter.nextToken()); | |
1472 } | |
1473 | |
1474 void NumberFormat2Test::TestAffixPatternDoubleQuote() { | |
1475 UnicodeString str("'Don''t'"); | |
1476 AffixPattern expected; | |
1477 // Don't | |
1478 static UChar chars[] = {0x44, 0x6F, 0x6E, 0x27, 0x74}; | |
1479 expected.addLiteral(chars, 0, UPRV_LENGTHOF(chars)); | |
1480 AffixPattern actual; | |
1481 UErrorCode status = U_ZERO_ERROR; | |
1482 AffixPattern::parseUserAffixString(str, actual, status); | |
1483 assertTrue("", expected.equals(actual)); | |
1484 UnicodeString formattedString; | |
1485 assertEquals("", "Don''t", actual.toUserString(formattedString)); | |
1486 assertSuccess("", status); | |
1487 } | |
1488 | |
1489 void NumberFormat2Test::TestAffixPatternParser() { | |
1490 UErrorCode status = U_ZERO_ERROR; | |
1491 static UChar USD[] = {0x55, 0x53, 0x44, 0x0}; | |
1492 LocalPointer<PluralRules> rules(PluralRules::forLocale("en", status)); | |
1493 DecimalFormatSymbols symbols("en", status); | |
1494 if (U_FAILURE(status)) { | |
1495 dataerrln("Error creating DecimalFormatSymbols - %s", u_errorName(status
)); | |
1496 return; | |
1497 } | |
1498 AffixPatternParser parser(symbols); | |
1499 CurrencyAffixInfo currencyAffixInfo; | |
1500 currencyAffixInfo.set("en", rules.getAlias(), USD, status); | |
1501 PluralAffix affix; | |
1502 UnicodeString str("'--y'''dz'%'\\u00a4\\u00a4\\u00a4\\u00a4 y '\\u00a4\\u00a
4\\u00a4 or '\\u00a4\\u00a4 but '\\u00a4"); | |
1503 str = str.unescape(); | |
1504 assertSuccess("", status); | |
1505 AffixPattern affixPattern; | |
1506 parser.parse( | |
1507 AffixPattern::parseAffixString(str, affixPattern, status), | |
1508 currencyAffixInfo, | |
1509 affix, | |
1510 status); | |
1511 UnicodeString formattedStr; | |
1512 affixPattern.toString(formattedStr); | |
1513 UnicodeString expectedFormattedStr("'--y''dz'%'\\u00a4\\u00a4\\u00a4\\u00a4
y '\\u00a4\\u00a4\\u00a4 or '\\u00a4\\u00a4 but '\\u00a4"); | |
1514 expectedFormattedStr = expectedFormattedStr.unescape(); | |
1515 assertEquals("1", expectedFormattedStr, formattedStr); | |
1516 AffixPattern userAffixPattern; | |
1517 UnicodeString userStr("-'-'y'''d'z%\\u00a4\\u00a4\\u00a4'\\u00a4' y \\u00a4\
\u00a4\\u00a4 or \\u00a4\\u00a4 but \\u00a4"); | |
1518 userStr = userStr.unescape(); | |
1519 AffixPattern::parseUserAffixString(userStr, userAffixPattern, status), | |
1520 assertTrue("", affixPattern.equals(userAffixPattern)); | |
1521 AffixPattern userAffixPattern2; | |
1522 UnicodeString formattedUserStr; | |
1523 AffixPattern::parseUserAffixString( | |
1524 userAffixPattern.toUserString(formattedUserStr), | |
1525 userAffixPattern2, | |
1526 status); | |
1527 UnicodeString expectedFormattedUserStr( | |
1528 "-'-'y''dz%\\u00a4\\u00a4\\u00a4'\\u00a4' y \\u00a4\\u00a4\\u00a4 or
\\u00a4\\u00a4 but \\u00a4"); | |
1529 assertEquals("2", expectedFormattedUserStr.unescape(), formattedUserStr); | |
1530 assertTrue("", userAffixPattern2.equals(userAffixPattern)); | |
1531 assertSuccess("", status); | |
1532 assertTrue("", affixPattern.usesCurrency()); | |
1533 assertTrue("", affixPattern.usesPercent()); | |
1534 assertFalse("", affixPattern.usesPermill()); | |
1535 assertTrue("", affix.hasMultipleVariants()); | |
1536 { | |
1537 // other | |
1538 NumberFormat2Test_Attributes expectedAttributes[] = { | |
1539 {UNUM_SIGN_FIELD, 0, 1}, | |
1540 {UNUM_PERCENT_FIELD, 6, 7}, | |
1541 {UNUM_CURRENCY_FIELD, 7, 17}, | |
1542 {UNUM_CURRENCY_FIELD, 21, 31}, | |
1543 {UNUM_CURRENCY_FIELD, 35, 38}, | |
1544 {UNUM_CURRENCY_FIELD, 43, 44}, | |
1545 {0, -1, 0}}; | |
1546 verifyAffix( | |
1547 "--y'dz%US dollars\\u00a4 y US dollars or USD but $", | |
1548 affix.getByCategory("other"), | |
1549 expectedAttributes); | |
1550 } | |
1551 { | |
1552 // one | |
1553 NumberFormat2Test_Attributes expectedAttributes[] = { | |
1554 {UNUM_SIGN_FIELD, 0, 1}, | |
1555 {UNUM_PERCENT_FIELD, 6, 7}, | |
1556 {UNUM_CURRENCY_FIELD, 7, 16}, | |
1557 {UNUM_CURRENCY_FIELD, 20, 29}, | |
1558 {UNUM_CURRENCY_FIELD, 33, 36}, | |
1559 {UNUM_CURRENCY_FIELD, 41, 42}, | |
1560 {0, -1, 0}}; | |
1561 verifyAffix( | |
1562 "--y'dz%US dollar\\u00a4 y US dollar or USD but $", | |
1563 affix.getByCategory("one"), | |
1564 expectedAttributes); | |
1565 } | |
1566 affix.remove(); | |
1567 str = "%'-"; | |
1568 affixPattern.remove(); | |
1569 parser.parse( | |
1570 AffixPattern::parseAffixString(str, affixPattern, status), | |
1571 currencyAffixInfo, | |
1572 affix, | |
1573 status); | |
1574 assertSuccess("", status); | |
1575 assertFalse("", affixPattern.usesCurrency()); | |
1576 assertFalse("", affixPattern.usesPercent()); | |
1577 assertFalse("", affixPattern.usesPermill()); | |
1578 assertFalse("", affix.hasMultipleVariants()); | |
1579 { | |
1580 // other | |
1581 NumberFormat2Test_Attributes expectedAttributes[] = { | |
1582 {UNUM_SIGN_FIELD, 1, 2}, | |
1583 {0, -1, 0}}; | |
1584 verifyAffix( | |
1585 "%-", | |
1586 affix.getByCategory("other"), | |
1587 expectedAttributes); | |
1588 } | |
1589 UnicodeString a4("\\u00a4"); | |
1590 AffixPattern scratchPattern; | |
1591 AffixPattern::parseAffixString(a4.unescape(), scratchPattern, status); | |
1592 assertFalse("", scratchPattern.usesCurrency()); | |
1593 | |
1594 // Test really long string > 256 chars. | |
1595 str = "'\\u2030012345678901234567890123456789012345678901234567890123456789" | |
1596 "012345678901234567890123456789012345678901234567890123456789" | |
1597 "012345678901234567890123456789012345678901234567890123456789" | |
1598 "012345678901234567890123456789012345678901234567890123456789" | |
1599 "012345678901234567890123456789012345678901234567890123456789"; | |
1600 str = str.unescape(); | |
1601 affixPattern.remove(); | |
1602 affix.remove(); | |
1603 parser.parse( | |
1604 AffixPattern::parseAffixString(str, affixPattern, status), | |
1605 currencyAffixInfo, | |
1606 affix, | |
1607 status); | |
1608 assertSuccess("", status); | |
1609 assertFalse("", affixPattern.usesCurrency()); | |
1610 assertFalse("", affixPattern.usesPercent()); | |
1611 assertTrue("", affixPattern.usesPermill()); | |
1612 assertFalse("", affix.hasMultipleVariants()); | |
1613 { | |
1614 UnicodeString expected = | |
1615 "\\u2030012345678901234567890123456789012345678901234567890123456789" | |
1616 "012345678901234567890123456789012345678901234567890123456789" | |
1617 "012345678901234567890123456789012345678901234567890123456789" | |
1618 "012345678901234567890123456789012345678901234567890123456789" | |
1619 "012345678901234567890123456789012345678901234567890123456789"; | |
1620 expected = expected.unescape(); | |
1621 NumberFormat2Test_Attributes expectedAttributes[] = { | |
1622 {UNUM_PERMILL_FIELD, 0, 1}, | |
1623 {0, -1, 0}}; | |
1624 verifyAffix( | |
1625 expected, | |
1626 affix.getOtherVariant(), | |
1627 expectedAttributes); | |
1628 } | |
1629 } | |
1630 | |
1631 void NumberFormat2Test::TestAffixPatternAppend() { | |
1632 AffixPattern pattern; | |
1633 UErrorCode status = U_ZERO_ERROR; | |
1634 UnicodeString patternStr("%\\u2030"); | |
1635 AffixPattern::parseUserAffixString( | |
1636 patternStr.unescape(), pattern, status); | |
1637 | |
1638 AffixPattern appendPattern; | |
1639 UnicodeString appendPatternStr("-\\u00a4\\u00a4*"); | |
1640 AffixPattern::parseUserAffixString( | |
1641 appendPatternStr.unescape(), appendPattern, status); | |
1642 | |
1643 AffixPattern expectedPattern; | |
1644 UnicodeString expectedPatternStr("%\\u2030-\\u00a4\\u00a4*"); | |
1645 AffixPattern::parseUserAffixString( | |
1646 expectedPatternStr.unescape(), expectedPattern, status); | |
1647 | |
1648 assertTrue("", pattern.append(appendPattern).equals(expectedPattern)); | |
1649 assertSuccess("", status); | |
1650 } | |
1651 | |
1652 void NumberFormat2Test::TestAffixPatternAppendAjoiningLiterals() { | |
1653 AffixPattern pattern; | |
1654 UErrorCode status = U_ZERO_ERROR; | |
1655 UnicodeString patternStr("%baaa"); | |
1656 AffixPattern::parseUserAffixString( | |
1657 patternStr, pattern, status); | |
1658 | |
1659 AffixPattern appendPattern; | |
1660 UnicodeString appendPatternStr("caa%"); | |
1661 AffixPattern::parseUserAffixString( | |
1662 appendPatternStr, appendPattern, status); | |
1663 | |
1664 AffixPattern expectedPattern; | |
1665 UnicodeString expectedPatternStr("%baaacaa%"); | |
1666 AffixPattern::parseUserAffixString( | |
1667 expectedPatternStr, expectedPattern, status); | |
1668 | |
1669 assertTrue("", pattern.append(appendPattern).equals(expectedPattern)); | |
1670 assertSuccess("", status); | |
1671 } | |
1672 | |
1673 void NumberFormat2Test::TestLargeIntValue() { | |
1674 VisibleDigits digits; | |
1675 { | |
1676 UErrorCode status = U_ZERO_ERROR; | |
1677 FixedPrecision precision; | |
1678 | |
1679 // Last 18 digits for int values. | |
1680 verifyIntValue( | |
1681 223372036854775807LL, | |
1682 precision.initVisibleDigits(INT64_MAX, digits, status)); | |
1683 assertSuccess("INT64_MAX", status); | |
1684 } | |
1685 { | |
1686 UErrorCode status = U_ZERO_ERROR; | |
1687 FixedPrecision precision; | |
1688 precision.fMax.setIntDigitCount(5); | |
1689 | |
1690 // Last 18 digits for int values. | |
1691 verifyIntValue( | |
1692 75807LL, | |
1693 precision.initVisibleDigits(INT64_MAX, digits, status)); | |
1694 verifySource(75807.0, digits); | |
1695 assertSuccess("75807", status); | |
1696 } | |
1697 { | |
1698 UErrorCode status = U_ZERO_ERROR; | |
1699 FixedPrecision precision; | |
1700 | |
1701 // Last 18 digits for int values. | |
1702 verifyIntValue( | |
1703 223372036854775808LL, | |
1704 precision.initVisibleDigits(INT64_MIN, digits, status)); | |
1705 assertSuccess("INT64_MIN", status); | |
1706 } | |
1707 { | |
1708 UErrorCode status = U_ZERO_ERROR; | |
1709 FixedPrecision precision; | |
1710 precision.fMax.setIntDigitCount(5); | |
1711 | |
1712 // Last 18 digits for int values. | |
1713 verifyIntValue( | |
1714 75808LL, | |
1715 precision.initVisibleDigits(INT64_MIN, digits, status)); | |
1716 verifySource(75808.0, digits); | |
1717 assertSuccess("75808", status); | |
1718 } | |
1719 | |
1720 } | |
1721 | |
1722 void NumberFormat2Test::TestIntInitVisibleDigits() { | |
1723 VisibleDigits digits; | |
1724 { | |
1725 UErrorCode status = U_ZERO_ERROR; | |
1726 FixedPrecision precision; | |
1727 verifyVisibleDigits( | |
1728 "13", | |
1729 FALSE, | |
1730 precision.initVisibleDigits((int64_t) 13LL, digits, status)); | |
1731 assertSuccess("13", status); | |
1732 } | |
1733 { | |
1734 UErrorCode status = U_ZERO_ERROR; | |
1735 FixedPrecision precision; | |
1736 verifyVisibleDigits( | |
1737 "17", | |
1738 TRUE, | |
1739 precision.initVisibleDigits((int64_t) -17LL, digits, status)); | |
1740 assertSuccess("-17", status); | |
1741 } | |
1742 { | |
1743 UErrorCode status = U_ZERO_ERROR; | |
1744 FixedPrecision precision; | |
1745 verifyVisibleDigits( | |
1746 "9223372036854775808", | |
1747 TRUE, | |
1748 precision.initVisibleDigits(INT64_MIN, digits, status)); | |
1749 assertSuccess("-9223372036854775808", status); | |
1750 } | |
1751 { | |
1752 UErrorCode status = U_ZERO_ERROR; | |
1753 FixedPrecision precision; | |
1754 verifyVisibleDigits( | |
1755 "9223372036854775807", | |
1756 FALSE, | |
1757 precision.initVisibleDigits(INT64_MAX, digits, status)); | |
1758 assertSuccess("9223372036854775807", status); | |
1759 } | |
1760 { | |
1761 UErrorCode status = U_ZERO_ERROR; | |
1762 FixedPrecision precision; | |
1763 verifyVisibleDigits( | |
1764 "31536000", | |
1765 TRUE, | |
1766 precision.initVisibleDigits((int64_t) -31536000LL, digits, statu
s)); | |
1767 assertSuccess("-31536000", status); | |
1768 } | |
1769 { | |
1770 UErrorCode status = U_ZERO_ERROR; | |
1771 FixedPrecision precision; | |
1772 verifyVisibleDigits( | |
1773 "0", | |
1774 FALSE, | |
1775 precision.initVisibleDigits((int64_t) 0LL, digits, status)); | |
1776 assertSuccess("0", status); | |
1777 } | |
1778 { | |
1779 UErrorCode status = U_ZERO_ERROR; | |
1780 FixedPrecision precision; | |
1781 precision.fMin.setIntDigitCount(4); | |
1782 precision.fMin.setFracDigitCount(2); | |
1783 verifyVisibleDigits( | |
1784 "0000.00", | |
1785 FALSE, | |
1786 precision.initVisibleDigits((int64_t) 0LL, digits, status)); | |
1787 assertSuccess("0", status); | |
1788 } | |
1789 { | |
1790 UErrorCode status = U_ZERO_ERROR; | |
1791 FixedPrecision precision; | |
1792 precision.fMin.setIntDigitCount(4); | |
1793 precision.fMin.setFracDigitCount(2); | |
1794 verifyVisibleDigits( | |
1795 "0057.00", | |
1796 FALSE, | |
1797 precision.initVisibleDigits((int64_t) 57LL, digits, status)); | |
1798 assertSuccess("57", status); | |
1799 } | |
1800 { | |
1801 UErrorCode status = U_ZERO_ERROR; | |
1802 FixedPrecision precision; | |
1803 precision.fMin.setIntDigitCount(4); | |
1804 precision.fMin.setFracDigitCount(2); | |
1805 verifyVisibleDigits( | |
1806 "0057.00", | |
1807 TRUE, | |
1808 precision.initVisibleDigits((int64_t) -57LL, digits, status)); | |
1809 assertSuccess("-57", status); | |
1810 } | |
1811 { | |
1812 UErrorCode status = U_ZERO_ERROR; | |
1813 FixedPrecision precision; | |
1814 precision.fMax.setIntDigitCount(2); | |
1815 precision.fMin.setFracDigitCount(1); | |
1816 verifyVisibleDigits( | |
1817 "35.0", | |
1818 FALSE, | |
1819 precision.initVisibleDigits((int64_t) 235LL, digits, status)); | |
1820 assertSuccess("235", status); | |
1821 } | |
1822 { | |
1823 UErrorCode status = U_ZERO_ERROR; | |
1824 FixedPrecision precision; | |
1825 precision.fMax.setIntDigitCount(2); | |
1826 precision.fMin.setFracDigitCount(1); | |
1827 precision.fFailIfOverMax = TRUE; | |
1828 precision.initVisibleDigits((int64_t) 239LL, digits, status); | |
1829 if (status != U_ILLEGAL_ARGUMENT_ERROR) { | |
1830 errln("239: Expected U_ILLEGAL_ARGUMENT_ERROR"); | |
1831 } | |
1832 } | |
1833 { | |
1834 UErrorCode status = U_ZERO_ERROR; | |
1835 FixedPrecision precision; | |
1836 precision.fSignificant.setMin(5); | |
1837 verifyVisibleDigits( | |
1838 "153.00", | |
1839 FALSE, | |
1840 precision.initVisibleDigits((int64_t) 153LL, digits, status)); | |
1841 assertSuccess("153", status); | |
1842 } | |
1843 { | |
1844 UErrorCode status = U_ZERO_ERROR; | |
1845 FixedPrecision precision; | |
1846 precision.fSignificant.setMax(2); | |
1847 precision.fExactOnly = TRUE; | |
1848 precision.initVisibleDigits((int64_t) 154LL, digits, status); | |
1849 if (status != U_FORMAT_INEXACT_ERROR) { | |
1850 errln("154: Expected U_FORMAT_INEXACT_ERROR"); | |
1851 } | |
1852 } | |
1853 { | |
1854 UErrorCode status = U_ZERO_ERROR; | |
1855 FixedPrecision precision; | |
1856 precision.fSignificant.setMax(5); | |
1857 verifyVisibleDigits( | |
1858 "150", | |
1859 FALSE, | |
1860 precision.initVisibleDigits((int64_t) 150LL, digits, status)); | |
1861 assertSuccess("150", status); | |
1862 } | |
1863 } | |
1864 | |
1865 void NumberFormat2Test::TestIntInitVisibleDigitsToDigitList() { | |
1866 VisibleDigits digits; | |
1867 { | |
1868 UErrorCode status = U_ZERO_ERROR; | |
1869 FixedPrecision precision; | |
1870 precision.fRoundingIncrement.set(7.3); | |
1871 verifyVisibleDigits( | |
1872 "29.2", | |
1873 TRUE, | |
1874 precision.initVisibleDigits((int64_t) -30LL, digits, status)); | |
1875 assertSuccess("-29.2", status); | |
1876 } | |
1877 { | |
1878 UErrorCode status = U_ZERO_ERROR; | |
1879 FixedPrecision precision; | |
1880 precision.fRoundingIncrement.set(7.3); | |
1881 precision.fRoundingMode = DecimalFormat::kRoundFloor; | |
1882 verifyVisibleDigits( | |
1883 "36.5", | |
1884 TRUE, | |
1885 precision.initVisibleDigits((int64_t) -30LL, digits, status)); | |
1886 assertSuccess("-36.5", status); | |
1887 } | |
1888 { | |
1889 UErrorCode status = U_ZERO_ERROR; | |
1890 FixedPrecision precision; | |
1891 precision.fSignificant.setMax(3); | |
1892 precision.fRoundingMode = DecimalFormat::kRoundCeiling; | |
1893 verifyVisibleDigits( | |
1894 "1390", | |
1895 FALSE, | |
1896 precision.initVisibleDigits((int64_t) 1381LL, digits, status)); | |
1897 assertSuccess("1390", status); | |
1898 } | |
1899 { | |
1900 UErrorCode status = U_ZERO_ERROR; | |
1901 FixedPrecision precision; | |
1902 precision.fSignificant.setMax(1); | |
1903 precision.fRoundingMode = DecimalFormat::kRoundFloor; | |
1904 verifyVisibleDigits( | |
1905 "2000", | |
1906 TRUE, | |
1907 precision.initVisibleDigits((int64_t) -1381LL, digits, status)); | |
1908 assertSuccess("-2000", status); | |
1909 } | |
1910 } | |
1911 | |
1912 void NumberFormat2Test::TestDoubleInitVisibleDigits() { | |
1913 VisibleDigits digits; | |
1914 { | |
1915 UErrorCode status = U_ZERO_ERROR; | |
1916 FixedPrecision precision; | |
1917 verifyVisibleDigits( | |
1918 "2.05", | |
1919 FALSE, | |
1920 precision.initVisibleDigits(2.05, digits, status)); | |
1921 assertSuccess("2.05", status); | |
1922 } | |
1923 { | |
1924 UErrorCode status = U_ZERO_ERROR; | |
1925 FixedPrecision precision; | |
1926 verifyVisibleDigits( | |
1927 "3547", | |
1928 FALSE, | |
1929 precision.initVisibleDigits(3547.0, digits, status)); | |
1930 assertSuccess("3547", status); | |
1931 } | |
1932 { | |
1933 UErrorCode status = U_ZERO_ERROR; | |
1934 FixedPrecision precision; | |
1935 precision.fMax.setFracDigitCount(2); | |
1936 precision.fMax.setIntDigitCount(1); | |
1937 precision.fFailIfOverMax = TRUE; | |
1938 precision.fExactOnly = TRUE; | |
1939 verifyVisibleDigits( | |
1940 "2.05", | |
1941 TRUE, | |
1942 precision.initVisibleDigits(-2.05, digits, status)); | |
1943 assertSuccess("-2.05", status); | |
1944 } | |
1945 { | |
1946 UErrorCode status = U_ZERO_ERROR; | |
1947 FixedPrecision precision; | |
1948 precision.fMax.setFracDigitCount(1); | |
1949 precision.fMax.setIntDigitCount(1); | |
1950 precision.fFailIfOverMax = TRUE; | |
1951 precision.fExactOnly = TRUE; | |
1952 precision.initVisibleDigits(-2.05, digits, status); | |
1953 if (status != U_FORMAT_INEXACT_ERROR) { | |
1954 errln("6245.3: Expected U_FORMAT_INEXACT_ERROR"); | |
1955 } | |
1956 } | |
1957 { | |
1958 UErrorCode status = U_ZERO_ERROR; | |
1959 FixedPrecision precision; | |
1960 precision.fMax.setFracDigitCount(2); | |
1961 precision.fMax.setIntDigitCount(0); | |
1962 precision.fFailIfOverMax = TRUE; | |
1963 precision.fExactOnly = TRUE; | |
1964 precision.initVisibleDigits(-2.05, digits, status); | |
1965 if (status != U_ILLEGAL_ARGUMENT_ERROR) { | |
1966 errln("-2.05: Expected U_ILLEGAL_ARGUMENT_ERROR"); | |
1967 } | |
1968 } | |
1969 { | |
1970 UErrorCode status = U_ZERO_ERROR; | |
1971 FixedPrecision precision; | |
1972 precision.fMin.setIntDigitCount(5); | |
1973 precision.fMin.setFracDigitCount(2); | |
1974 precision.fExactOnly = TRUE; | |
1975 verifyVisibleDigits( | |
1976 "06245.30", | |
1977 FALSE, | |
1978 precision.initVisibleDigits(6245.3, digits, status)); | |
1979 assertSuccess("06245.30", status); | |
1980 } | |
1981 { | |
1982 UErrorCode status = U_ZERO_ERROR; | |
1983 FixedPrecision precision; | |
1984 precision.fSignificant.setMax(5); | |
1985 precision.fExactOnly = TRUE; | |
1986 verifyVisibleDigits( | |
1987 "6245.3", | |
1988 FALSE, | |
1989 precision.initVisibleDigits(6245.3, digits, status)); | |
1990 assertSuccess("6245.3", status); | |
1991 } | |
1992 { | |
1993 UErrorCode status = U_ZERO_ERROR; | |
1994 FixedPrecision precision; | |
1995 precision.fSignificant.setMax(4); | |
1996 precision.fExactOnly = TRUE; | |
1997 precision.initVisibleDigits(6245.3, digits, status); | |
1998 if (status != U_FORMAT_INEXACT_ERROR) { | |
1999 errln("6245.3: Expected U_FORMAT_INEXACT_ERROR"); | |
2000 } | |
2001 } | |
2002 { | |
2003 UErrorCode status = U_ZERO_ERROR; | |
2004 FixedPrecision precision; | |
2005 precision.fMax.setIntDigitCount(3); | |
2006 precision.fMin.setFracDigitCount(2); | |
2007 verifyVisibleDigits( | |
2008 "384.90", | |
2009 FALSE, | |
2010 precision.initVisibleDigits(2384.9, digits, status)); | |
2011 assertSuccess("380.00", status); | |
2012 } | |
2013 { | |
2014 UErrorCode status = U_ZERO_ERROR; | |
2015 FixedPrecision precision; | |
2016 precision.fMax.setIntDigitCount(3); | |
2017 precision.fMin.setFracDigitCount(2); | |
2018 precision.fFailIfOverMax = TRUE; | |
2019 precision.initVisibleDigits(2384.9, digits, status); | |
2020 if (status != U_ILLEGAL_ARGUMENT_ERROR) { | |
2021 errln("2384.9: Expected U_ILLEGAL_ARGUMENT_ERROR"); | |
2022 } | |
2023 } | |
2024 } | |
2025 | |
2026 void NumberFormat2Test::TestDoubleInitVisibleDigitsToDigitList() { | |
2027 VisibleDigits digits; | |
2028 { | |
2029 UErrorCode status = U_ZERO_ERROR; | |
2030 FixedPrecision precision; | |
2031 // 2.01 produces round off error when multiplied by powers of | |
2032 // 10 forcing the use of DigitList. | |
2033 verifyVisibleDigits( | |
2034 "2.01", | |
2035 TRUE, | |
2036 precision.initVisibleDigits(-2.01, digits, status)); | |
2037 assertSuccess("-2.01", status); | |
2038 } | |
2039 { | |
2040 UErrorCode status = U_ZERO_ERROR; | |
2041 FixedPrecision precision; | |
2042 precision.fSignificant.setMax(3); | |
2043 precision.fMin.setFracDigitCount(2); | |
2044 verifyVisibleDigits( | |
2045 "2380.00", | |
2046 FALSE, | |
2047 precision.initVisibleDigits(2385.0, digits, status)); | |
2048 assertSuccess("2380.00", status); | |
2049 } | |
2050 { | |
2051 UErrorCode status = U_ZERO_ERROR; | |
2052 FixedPrecision precision; | |
2053 precision.fMax.setFracDigitCount(2); | |
2054 verifyVisibleDigits( | |
2055 "45.83", | |
2056 TRUE, | |
2057 precision.initVisibleDigits(-45.8251, digits, status)); | |
2058 assertSuccess("45.83", status); | |
2059 } | |
2060 } | |
2061 | |
2062 void NumberFormat2Test::TestDigitListInitVisibleDigits() { | |
2063 VisibleDigits digits; | |
2064 DigitList dlist; | |
2065 { | |
2066 UErrorCode status = U_ZERO_ERROR; | |
2067 FixedPrecision precision; | |
2068 precision.fMax.setIntDigitCount(3); | |
2069 precision.fMin.setFracDigitCount(2); | |
2070 precision.fFailIfOverMax = TRUE; | |
2071 dlist.set(2384.9); | |
2072 precision.initVisibleDigits(dlist, digits, status); | |
2073 if (status != U_ILLEGAL_ARGUMENT_ERROR) { | |
2074 errln("2384.9: Expected U_ILLEGAL_ARGUMENT_ERROR"); | |
2075 } | |
2076 } | |
2077 { | |
2078 UErrorCode status = U_ZERO_ERROR; | |
2079 FixedPrecision precision; | |
2080 precision.fSignificant.setMax(4); | |
2081 precision.fExactOnly = TRUE; | |
2082 dlist.set(6245.3); | |
2083 precision.initVisibleDigits(dlist, digits, status); | |
2084 if (status != U_FORMAT_INEXACT_ERROR) { | |
2085 errln("6245.3: Expected U_FORMAT_INEXACT_ERROR"); | |
2086 } | |
2087 } | |
2088 } | |
2089 | |
2090 void NumberFormat2Test::TestSpecialInitVisibleDigits() { | |
2091 VisibleDigits digits; | |
2092 { | |
2093 UErrorCode status = U_ZERO_ERROR; | |
2094 FixedPrecision precision; | |
2095 precision.fSignificant.setMax(3); | |
2096 precision.fMin.setFracDigitCount(2); | |
2097 precision.initVisibleDigits(-uprv_getInfinity(), digits, status); | |
2098 assertFalse("", digits.isNaN()); | |
2099 assertTrue("", digits.isInfinite()); | |
2100 assertTrue("", digits.isNegative()); | |
2101 assertSuccess("-Inf", status); | |
2102 } | |
2103 { | |
2104 UErrorCode status = U_ZERO_ERROR; | |
2105 FixedPrecision precision; | |
2106 precision.initVisibleDigits(uprv_getInfinity(), digits, status); | |
2107 assertFalse("", digits.isNaN()); | |
2108 assertTrue("", digits.isInfinite()); | |
2109 assertFalse("", digits.isNegative()); | |
2110 assertSuccess("Inf", status); | |
2111 } | |
2112 { | |
2113 UErrorCode status = U_ZERO_ERROR; | |
2114 FixedPrecision precision; | |
2115 precision.initVisibleDigits(uprv_getNaN(), digits, status); | |
2116 assertTrue("", digits.isNaN()); | |
2117 assertSuccess("Inf", status); | |
2118 } | |
2119 } | |
2120 | |
2121 void NumberFormat2Test::TestVisibleDigitsWithExponent() { | |
2122 VisibleDigitsWithExponent digits; | |
2123 { | |
2124 UErrorCode status = U_ZERO_ERROR; | |
2125 ScientificPrecision precision; | |
2126 precision.initVisibleDigitsWithExponent(389.256, digits, status); | |
2127 verifyVisibleDigitsWithExponent( | |
2128 "3.89256E2", FALSE, digits); | |
2129 assertSuccess("3.89256E2", status); | |
2130 } | |
2131 { | |
2132 UErrorCode status = U_ZERO_ERROR; | |
2133 ScientificPrecision precision; | |
2134 precision.initVisibleDigitsWithExponent(-389.256, digits, status); | |
2135 verifyVisibleDigitsWithExponent( | |
2136 "3.89256E2", TRUE, digits); | |
2137 assertSuccess("-3.89256E2", status); | |
2138 } | |
2139 { | |
2140 UErrorCode status = U_ZERO_ERROR; | |
2141 ScientificPrecision precision; | |
2142 precision.fMinExponentDigits = 3; | |
2143 precision.fMantissa.fMin.setIntDigitCount(1); | |
2144 precision.fMantissa.fMax.setIntDigitCount(3); | |
2145 precision.initVisibleDigitsWithExponent(12345.67, digits, status); | |
2146 verifyVisibleDigitsWithExponent( | |
2147 "12.34567E003", FALSE, digits); | |
2148 assertSuccess("12.34567E003", status); | |
2149 } | |
2150 { | |
2151 UErrorCode status = U_ZERO_ERROR; | |
2152 ScientificPrecision precision; | |
2153 precision.fMantissa.fRoundingIncrement.set(0.073); | |
2154 precision.fMantissa.fMin.setIntDigitCount(2); | |
2155 precision.fMantissa.fMax.setIntDigitCount(2); | |
2156 precision.initVisibleDigitsWithExponent(999.74, digits, status); | |
2157 verifyVisibleDigitsWithExponent( | |
2158 "10.001E2", FALSE, digits); | |
2159 assertSuccess("10.001E2", status); | |
2160 } | |
2161 } | |
2162 | |
2163 void NumberFormat2Test::TestDigitAffixesAndPadding() { | |
2164 UErrorCode status = U_ZERO_ERROR; | |
2165 DecimalFormatSymbols symbols("en", status); | |
2166 if (!assertSuccess("", status)) { | |
2167 return; | |
2168 } | |
2169 DigitFormatter formatter(symbols); | |
2170 DigitGrouping grouping; | |
2171 grouping.fGrouping = 3; | |
2172 FixedPrecision precision; | |
2173 DigitFormatterOptions options; | |
2174 options.fAlwaysShowDecimal = TRUE; | |
2175 ValueFormatter vf; | |
2176 vf.prepareFixedDecimalFormatting( | |
2177 formatter, | |
2178 grouping, | |
2179 precision, | |
2180 options); | |
2181 DigitAffixesAndPadding aap; | |
2182 aap.fPositivePrefix.append("(+", UNUM_SIGN_FIELD); | |
2183 aap.fPositiveSuffix.append("+)", UNUM_SIGN_FIELD); | |
2184 aap.fNegativePrefix.append("(-", UNUM_SIGN_FIELD); | |
2185 aap.fNegativeSuffix.append("-)", UNUM_SIGN_FIELD); | |
2186 aap.fWidth = 10; | |
2187 aap.fPadPosition = DigitAffixesAndPadding::kPadBeforePrefix; | |
2188 { | |
2189 NumberFormat2Test_Attributes expectedAttributes[] = { | |
2190 {UNUM_SIGN_FIELD, 4, 6}, | |
2191 {UNUM_INTEGER_FIELD, 6, 7}, | |
2192 {UNUM_DECIMAL_SEPARATOR_FIELD, 7, 8}, | |
2193 {UNUM_SIGN_FIELD, 8, 10}, | |
2194 {0, -1, 0}}; | |
2195 verifyAffixesAndPaddingInt32( | |
2196 "****(+3.+)", | |
2197 aap, | |
2198 3, | |
2199 vf, | |
2200 NULL, | |
2201 expectedAttributes); | |
2202 } | |
2203 aap.fPadPosition = DigitAffixesAndPadding::kPadAfterPrefix; | |
2204 { | |
2205 NumberFormat2Test_Attributes expectedAttributes[] = { | |
2206 {UNUM_SIGN_FIELD, 0, 2}, | |
2207 {UNUM_INTEGER_FIELD, 6, 7}, | |
2208 {UNUM_DECIMAL_SEPARATOR_FIELD, 7, 8}, | |
2209 {UNUM_SIGN_FIELD, 8, 10}, | |
2210 {0, -1, 0}}; | |
2211 verifyAffixesAndPaddingInt32( | |
2212 "(+****3.+)", | |
2213 aap, | |
2214 3, | |
2215 vf, | |
2216 NULL, | |
2217 expectedAttributes); | |
2218 } | |
2219 aap.fPadPosition = DigitAffixesAndPadding::kPadBeforeSuffix; | |
2220 { | |
2221 NumberFormat2Test_Attributes expectedAttributes[] = { | |
2222 {UNUM_SIGN_FIELD, 0, 2}, | |
2223 {UNUM_INTEGER_FIELD, 2, 3}, | |
2224 {UNUM_DECIMAL_SEPARATOR_FIELD, 3, 4}, | |
2225 {UNUM_SIGN_FIELD, 8, 10}, | |
2226 {0, -1, 0}}; | |
2227 verifyAffixesAndPaddingInt32( | |
2228 "(+3.****+)", | |
2229 aap, | |
2230 3, | |
2231 vf, | |
2232 NULL, | |
2233 expectedAttributes); | |
2234 } | |
2235 aap.fPadPosition = DigitAffixesAndPadding::kPadAfterSuffix; | |
2236 { | |
2237 NumberFormat2Test_Attributes expectedAttributes[] = { | |
2238 {UNUM_SIGN_FIELD, 0, 2}, | |
2239 {UNUM_INTEGER_FIELD, 2, 3}, | |
2240 {UNUM_DECIMAL_SEPARATOR_FIELD, 3, 4}, | |
2241 {UNUM_SIGN_FIELD, 4, 6}, | |
2242 {0, -1, 0}}; | |
2243 verifyAffixesAndPaddingInt32( | |
2244 "(+3.+)****", | |
2245 aap, | |
2246 3, | |
2247 vf, | |
2248 NULL, | |
2249 expectedAttributes); | |
2250 } | |
2251 aap.fPadPosition = DigitAffixesAndPadding::kPadAfterSuffix; | |
2252 { | |
2253 DigitList digits; | |
2254 digits.set(-1234.5); | |
2255 NumberFormat2Test_Attributes expectedAttributes[] = { | |
2256 {UNUM_SIGN_FIELD, 0, 2}, | |
2257 {UNUM_GROUPING_SEPARATOR_FIELD, 3, 4}, | |
2258 {UNUM_INTEGER_FIELD, 2, 7}, | |
2259 {UNUM_DECIMAL_SEPARATOR_FIELD, 7, 8}, | |
2260 {UNUM_FRACTION_FIELD, 8, 9}, | |
2261 {UNUM_SIGN_FIELD, 9, 11}, | |
2262 {0, -1, 0}}; | |
2263 verifyAffixesAndPadding( | |
2264 "(-1,234.5-)", | |
2265 aap, | |
2266 digits, | |
2267 vf, | |
2268 NULL, | |
2269 expectedAttributes); | |
2270 } | |
2271 assertFalse("", aap.needsPluralRules()); | |
2272 | |
2273 aap.fWidth = 0; | |
2274 aap.fPositivePrefix.remove(); | |
2275 aap.fPositiveSuffix.remove(); | |
2276 aap.fNegativePrefix.remove(); | |
2277 aap.fNegativeSuffix.remove(); | |
2278 | |
2279 // Set up for plural currencies. | |
2280 aap.fNegativePrefix.append("-", UNUM_SIGN_FIELD); | |
2281 { | |
2282 PluralAffix part; | |
2283 part.setVariant("one", " Dollar", status); | |
2284 part.setVariant("other", " Dollars", status); | |
2285 aap.fPositiveSuffix.append(part, UNUM_CURRENCY_FIELD, status); | |
2286 } | |
2287 aap.fNegativeSuffix = aap.fPositiveSuffix; | |
2288 | |
2289 LocalPointer<PluralRules> rules(PluralRules::forLocale("en", status)); | |
2290 if (!assertSuccess("", status)) { | |
2291 return; | |
2292 } | |
2293 | |
2294 // Exercise the fastrack path | |
2295 { | |
2296 options.fAlwaysShowDecimal = FALSE; | |
2297 NumberFormat2Test_Attributes expectedAttributes[] = { | |
2298 {UNUM_SIGN_FIELD, 0, 1}, | |
2299 {UNUM_INTEGER_FIELD, 1, 3}, | |
2300 {UNUM_CURRENCY_FIELD, 3, 11}, | |
2301 {0, -1, 0}}; | |
2302 verifyAffixesAndPaddingInt32( | |
2303 "-45 Dollars", | |
2304 aap, | |
2305 -45, | |
2306 vf, | |
2307 NULL, | |
2308 expectedAttributes); | |
2309 options.fAlwaysShowDecimal = TRUE; | |
2310 } | |
2311 | |
2312 // Now test plurals | |
2313 assertTrue("", aap.needsPluralRules()); | |
2314 { | |
2315 NumberFormat2Test_Attributes expectedAttributes[] = { | |
2316 {UNUM_INTEGER_FIELD, 0, 1}, | |
2317 {UNUM_DECIMAL_SEPARATOR_FIELD, 1, 2}, | |
2318 {UNUM_CURRENCY_FIELD, 2, 9}, | |
2319 {0, -1, 0}}; | |
2320 verifyAffixesAndPaddingInt32( | |
2321 "1. Dollar", | |
2322 aap, | |
2323 1, | |
2324 vf, | |
2325 rules.getAlias(), | |
2326 expectedAttributes); | |
2327 } | |
2328 { | |
2329 NumberFormat2Test_Attributes expectedAttributes[] = { | |
2330 {UNUM_SIGN_FIELD, 0, 1}, | |
2331 {UNUM_INTEGER_FIELD, 1, 2}, | |
2332 {UNUM_DECIMAL_SEPARATOR_FIELD, 2, 3}, | |
2333 {UNUM_CURRENCY_FIELD, 3, 10}, | |
2334 {0, -1, 0}}; | |
2335 verifyAffixesAndPaddingInt32( | |
2336 "-1. Dollar", | |
2337 aap, | |
2338 -1, | |
2339 vf, | |
2340 rules.getAlias(), | |
2341 expectedAttributes); | |
2342 } | |
2343 precision.fMin.setFracDigitCount(2); | |
2344 { | |
2345 NumberFormat2Test_Attributes expectedAttributes[] = { | |
2346 {UNUM_INTEGER_FIELD, 0, 1}, | |
2347 {UNUM_DECIMAL_SEPARATOR_FIELD, 1, 2}, | |
2348 {UNUM_FRACTION_FIELD, 2, 4}, | |
2349 {UNUM_CURRENCY_FIELD, 4, 12}, | |
2350 {0, -1, 0}}; | |
2351 verifyAffixesAndPaddingInt32( | |
2352 "1.00 Dollars", | |
2353 aap, | |
2354 1, | |
2355 vf, | |
2356 rules.getAlias(), | |
2357 expectedAttributes); | |
2358 } | |
2359 } | |
2360 | |
2361 void NumberFormat2Test::TestPluralsAndRounding() { | |
2362 UErrorCode status = U_ZERO_ERROR; | |
2363 DecimalFormatSymbols symbols("en", status); | |
2364 if (!assertSuccess("", status)) { | |
2365 return; | |
2366 } | |
2367 DigitFormatter formatter(symbols); | |
2368 DigitGrouping grouping; | |
2369 FixedPrecision precision; | |
2370 precision.fSignificant.setMax(3); | |
2371 DigitFormatterOptions options; | |
2372 ValueFormatter vf; | |
2373 vf.prepareFixedDecimalFormatting( | |
2374 formatter, | |
2375 grouping, | |
2376 precision, | |
2377 options); | |
2378 DigitList digits; | |
2379 DigitAffixesAndPadding aap; | |
2380 // Set up for plural currencies. | |
2381 aap.fNegativePrefix.append("-", UNUM_SIGN_FIELD); | |
2382 { | |
2383 PluralAffix part; | |
2384 part.setVariant("one", " Dollar", status); | |
2385 part.setVariant("other", " Dollars", status); | |
2386 aap.fPositiveSuffix.append(part, UNUM_CURRENCY_FIELD, status); | |
2387 } | |
2388 aap.fNegativeSuffix = aap.fPositiveSuffix; | |
2389 aap.fWidth = 14; | |
2390 LocalPointer<PluralRules> rules(PluralRules::forLocale("en", status)); | |
2391 if (!assertSuccess("", status)) { | |
2392 return; | |
2393 } | |
2394 { | |
2395 digits.set(0.999); | |
2396 verifyAffixesAndPadding( | |
2397 "*0.999 Dollars", | |
2398 aap, | |
2399 digits, | |
2400 vf, | |
2401 rules.getAlias(), | |
2402 NULL); | |
2403 } | |
2404 { | |
2405 digits.set(0.9996); | |
2406 verifyAffixesAndPadding( | |
2407 "******1 Dollar", | |
2408 aap, | |
2409 digits, | |
2410 vf, | |
2411 rules.getAlias(), | |
2412 NULL); | |
2413 } | |
2414 { | |
2415 digits.set(1.004); | |
2416 verifyAffixesAndPadding( | |
2417 "******1 Dollar", | |
2418 aap, | |
2419 digits, | |
2420 vf, | |
2421 rules.getAlias(), | |
2422 NULL); | |
2423 } | |
2424 precision.fSignificant.setMin(2); | |
2425 { | |
2426 digits.set(0.9996); | |
2427 verifyAffixesAndPadding( | |
2428 "***1.0 Dollars", | |
2429 aap, | |
2430 digits, | |
2431 vf, | |
2432 rules.getAlias(), | |
2433 NULL); | |
2434 } | |
2435 { | |
2436 digits.set(1.004); | |
2437 verifyAffixesAndPadding( | |
2438 "***1.0 Dollars", | |
2439 aap, | |
2440 digits, | |
2441 vf, | |
2442 rules.getAlias(), | |
2443 NULL); | |
2444 } | |
2445 precision.fSignificant.setMin(0); | |
2446 { | |
2447 digits.set(-79.214); | |
2448 verifyAffixesAndPadding( | |
2449 "*-79.2 Dollars", | |
2450 aap, | |
2451 digits, | |
2452 vf, | |
2453 rules.getAlias(), | |
2454 NULL); | |
2455 } | |
2456 // No more sig digits just max fractions | |
2457 precision.fSignificant.setMax(0); | |
2458 precision.fMax.setFracDigitCount(4); | |
2459 { | |
2460 digits.set(79.213562); | |
2461 verifyAffixesAndPadding( | |
2462 "79.2136 Dollars", | |
2463 aap, | |
2464 digits, | |
2465 vf, | |
2466 rules.getAlias(), | |
2467 NULL); | |
2468 } | |
2469 | |
2470 } | |
2471 | |
2472 | |
2473 void NumberFormat2Test::TestPluralsAndRoundingScientific() { | |
2474 UErrorCode status = U_ZERO_ERROR; | |
2475 DecimalFormatSymbols symbols("en", status); | |
2476 if (!assertSuccess("", status)) { | |
2477 return; | |
2478 } | |
2479 DigitFormatter formatter(symbols); | |
2480 ScientificPrecision precision; | |
2481 precision.fMantissa.fSignificant.setMax(4); | |
2482 SciFormatterOptions options; | |
2483 ValueFormatter vf; | |
2484 vf.prepareScientificFormatting( | |
2485 formatter, | |
2486 precision, | |
2487 options); | |
2488 DigitList digits; | |
2489 DigitAffixesAndPadding aap; | |
2490 aap.fNegativePrefix.append("-", UNUM_SIGN_FIELD); | |
2491 { | |
2492 PluralAffix part; | |
2493 part.setVariant("one", " Meter", status); | |
2494 part.setVariant("other", " Meters", status); | |
2495 aap.fPositiveSuffix.append(part, UNUM_FIELD_COUNT, status); | |
2496 } | |
2497 aap.fNegativeSuffix = aap.fPositiveSuffix; | |
2498 LocalPointer<PluralRules> rules(PluralRules::forLocale("en", status)); | |
2499 if (!assertSuccess("", status)) { | |
2500 return; | |
2501 } | |
2502 { | |
2503 digits.set(0.99996); | |
2504 NumberFormat2Test_Attributes expectedAttributes[] = { | |
2505 {UNUM_INTEGER_FIELD, 0, 1}, | |
2506 {UNUM_EXPONENT_SYMBOL_FIELD, 1, 2}, | |
2507 {UNUM_EXPONENT_FIELD, 2, 3}, | |
2508 {0, -1, 0}}; | |
2509 verifyAffixesAndPadding( | |
2510 "1E0 Meters", | |
2511 aap, | |
2512 digits, | |
2513 vf, | |
2514 rules.getAlias(), | |
2515 expectedAttributes); | |
2516 } | |
2517 options.fMantissa.fAlwaysShowDecimal = TRUE; | |
2518 { | |
2519 digits.set(0.99996); | |
2520 NumberFormat2Test_Attributes expectedAttributes[] = { | |
2521 {UNUM_INTEGER_FIELD, 0, 1}, | |
2522 {UNUM_DECIMAL_SEPARATOR_FIELD, 1, 2}, | |
2523 {UNUM_EXPONENT_SYMBOL_FIELD, 2, 3}, | |
2524 {UNUM_EXPONENT_FIELD, 3, 4}, | |
2525 {0, -1, 0}}; | |
2526 verifyAffixesAndPadding( | |
2527 "1.E0 Meters", | |
2528 aap, | |
2529 digits, | |
2530 vf, | |
2531 rules.getAlias(), | |
2532 expectedAttributes); | |
2533 } | |
2534 { | |
2535 digits.set(-299792458); | |
2536 NumberFormat2Test_Attributes expectedAttributes[] = { | |
2537 {UNUM_SIGN_FIELD, 0, 1}, | |
2538 {UNUM_INTEGER_FIELD, 1, 2}, | |
2539 {UNUM_DECIMAL_SEPARATOR_FIELD, 2, 3}, | |
2540 {UNUM_FRACTION_FIELD, 3, 6}, | |
2541 {UNUM_EXPONENT_SYMBOL_FIELD, 6, 7}, | |
2542 {UNUM_EXPONENT_FIELD, 7, 8}, | |
2543 {0, -1, 0}}; | |
2544 verifyAffixesAndPadding( | |
2545 "-2.998E8 Meters", | |
2546 aap, | |
2547 digits, | |
2548 vf, | |
2549 rules.getAlias(), | |
2550 expectedAttributes); | |
2551 } | |
2552 precision.fMantissa.fSignificant.setMin(4); | |
2553 options.fExponent.fAlwaysShowSign = TRUE; | |
2554 precision.fMinExponentDigits = 3; | |
2555 { | |
2556 digits.set(3); | |
2557 NumberFormat2Test_Attributes expectedAttributes[] = { | |
2558 {UNUM_INTEGER_FIELD, 0, 1}, | |
2559 {UNUM_DECIMAL_SEPARATOR_FIELD, 1, 2}, | |
2560 {UNUM_FRACTION_FIELD, 2, 5}, | |
2561 {UNUM_EXPONENT_SYMBOL_FIELD, 5, 6}, | |
2562 {UNUM_EXPONENT_SIGN_FIELD, 6, 7}, | |
2563 {UNUM_EXPONENT_FIELD, 7, 10}, | |
2564 {0, -1, 0}}; | |
2565 verifyAffixesAndPadding( | |
2566 "3.000E+000 Meters", | |
2567 aap, | |
2568 digits, | |
2569 vf, | |
2570 rules.getAlias(), | |
2571 expectedAttributes); | |
2572 } | |
2573 precision.fMantissa.fMax.setIntDigitCount(3); | |
2574 { | |
2575 digits.set(0.00025001); | |
2576 NumberFormat2Test_Attributes expectedAttributes[] = { | |
2577 {UNUM_INTEGER_FIELD, 0, 3}, | |
2578 {UNUM_DECIMAL_SEPARATOR_FIELD, 3, 4}, | |
2579 {UNUM_FRACTION_FIELD, 4, 5}, | |
2580 {UNUM_EXPONENT_SYMBOL_FIELD, 5, 6}, | |
2581 {UNUM_EXPONENT_SIGN_FIELD, 6, 7}, | |
2582 {UNUM_EXPONENT_FIELD, 7, 10}, | |
2583 {0, -1, 0}}; | |
2584 verifyAffixesAndPadding( | |
2585 "250.0E-006 Meters", | |
2586 aap, | |
2587 digits, | |
2588 vf, | |
2589 rules.getAlias(), | |
2590 expectedAttributes); | |
2591 } | |
2592 { | |
2593 digits.set(0.0000025001); | |
2594 NumberFormat2Test_Attributes expectedAttributes[] = { | |
2595 {UNUM_INTEGER_FIELD, 0, 1}, | |
2596 {UNUM_DECIMAL_SEPARATOR_FIELD, 1, 2}, | |
2597 {UNUM_FRACTION_FIELD, 2, 5}, | |
2598 {UNUM_EXPONENT_SYMBOL_FIELD, 5, 6}, | |
2599 {UNUM_EXPONENT_SIGN_FIELD, 6, 7}, | |
2600 {UNUM_EXPONENT_FIELD, 7, 10}, | |
2601 {0, -1, 0}}; | |
2602 verifyAffixesAndPadding( | |
2603 "2.500E-006 Meters", | |
2604 aap, | |
2605 digits, | |
2606 vf, | |
2607 rules.getAlias(), | |
2608 expectedAttributes); | |
2609 } | |
2610 precision.fMantissa.fMax.setFracDigitCount(1); | |
2611 { | |
2612 digits.set(0.0000025499); | |
2613 NumberFormat2Test_Attributes expectedAttributes[] = { | |
2614 {UNUM_INTEGER_FIELD, 0, 1}, | |
2615 {UNUM_DECIMAL_SEPARATOR_FIELD, 1, 2}, | |
2616 {UNUM_FRACTION_FIELD, 2, 3}, | |
2617 {UNUM_EXPONENT_SYMBOL_FIELD, 3, 4}, | |
2618 {UNUM_EXPONENT_SIGN_FIELD, 4, 5}, | |
2619 {UNUM_EXPONENT_FIELD, 5, 8}, | |
2620 {0, -1, 0}}; | |
2621 verifyAffixesAndPadding( | |
2622 "2.5E-006 Meters", | |
2623 aap, | |
2624 digits, | |
2625 vf, | |
2626 rules.getAlias(), | |
2627 expectedAttributes); | |
2628 } | |
2629 precision.fMantissa.fMax.setIntDigitCount(1); | |
2630 precision.fMantissa.fMax.setFracDigitCount(2); | |
2631 { | |
2632 digits.set(299792458); | |
2633 verifyAffixesAndPadding( | |
2634 "3.00E+008 Meters", | |
2635 aap, | |
2636 digits, | |
2637 vf, | |
2638 rules.getAlias(), | |
2639 NULL); | |
2640 } | |
2641 // clear significant digits | |
2642 precision.fMantissa.fSignificant.setMin(0); | |
2643 precision.fMantissa.fSignificant.setMax(0); | |
2644 | |
2645 // set int and fraction digits | |
2646 precision.fMantissa.fMin.setFracDigitCount(2); | |
2647 precision.fMantissa.fMax.setFracDigitCount(4); | |
2648 precision.fMantissa.fMin.setIntDigitCount(2); | |
2649 precision.fMantissa.fMax.setIntDigitCount(3); | |
2650 { | |
2651 digits.set(-0.0000025300001); | |
2652 verifyAffixesAndPadding( | |
2653 "-253.00E-008 Meters", | |
2654 aap, | |
2655 digits, | |
2656 vf, | |
2657 rules.getAlias(), | |
2658 NULL); | |
2659 } | |
2660 { | |
2661 digits.set(-0.0000025300006); | |
2662 verifyAffixesAndPadding( | |
2663 "-253.0001E-008 Meters", | |
2664 aap, | |
2665 digits, | |
2666 vf, | |
2667 rules.getAlias(), | |
2668 NULL); | |
2669 } | |
2670 { | |
2671 digits.set(-0.000025300006); | |
2672 verifyAffixesAndPadding( | |
2673 "-25.30E-006 Meters", | |
2674 aap, | |
2675 digits, | |
2676 vf, | |
2677 rules.getAlias(), | |
2678 NULL); | |
2679 } | |
2680 } | |
2681 | |
2682 | |
2683 void NumberFormat2Test::TestRoundingIncrement() { | |
2684 UErrorCode status = U_ZERO_ERROR; | |
2685 DecimalFormatSymbols symbols("en", status); | |
2686 if (U_FAILURE(status)) { | |
2687 dataerrln("Error creating DecimalFormatSymbols - %s", u_errorName(status
)); | |
2688 return; | |
2689 } | |
2690 DigitFormatter formatter(symbols); | |
2691 ScientificPrecision precision; | |
2692 SciFormatterOptions options; | |
2693 precision.fMantissa.fRoundingIncrement.set(0.25); | |
2694 precision.fMantissa.fSignificant.setMax(4); | |
2695 DigitGrouping grouping; | |
2696 ValueFormatter vf; | |
2697 | |
2698 // fixed | |
2699 vf.prepareFixedDecimalFormatting( | |
2700 formatter, | |
2701 grouping, | |
2702 precision.fMantissa, | |
2703 options.fMantissa); | |
2704 DigitList digits; | |
2705 DigitAffixesAndPadding aap; | |
2706 aap.fNegativePrefix.append("-", UNUM_SIGN_FIELD); | |
2707 { | |
2708 digits.set(3.7); | |
2709 verifyAffixesAndPadding( | |
2710 "3.75", | |
2711 aap, | |
2712 digits, | |
2713 vf, | |
2714 NULL, NULL); | |
2715 } | |
2716 { | |
2717 digits.set(-7.4); | |
2718 verifyAffixesAndPadding( | |
2719 "-7.5", | |
2720 aap, | |
2721 digits, | |
2722 vf, | |
2723 NULL, NULL); | |
2724 } | |
2725 { | |
2726 digits.set(99.8); | |
2727 verifyAffixesAndPadding( | |
2728 "99.75", | |
2729 aap, | |
2730 digits, | |
2731 vf, | |
2732 NULL, NULL); | |
2733 } | |
2734 precision.fMantissa.fMin.setFracDigitCount(2); | |
2735 { | |
2736 digits.set(99.1); | |
2737 verifyAffixesAndPadding( | |
2738 "99.00", | |
2739 aap, | |
2740 digits, | |
2741 vf, | |
2742 NULL, NULL); | |
2743 } | |
2744 { | |
2745 digits.set(-639.65); | |
2746 verifyAffixesAndPadding( | |
2747 "-639.80", | |
2748 aap, | |
2749 digits, | |
2750 vf, | |
2751 NULL, NULL); | |
2752 } | |
2753 | |
2754 precision.fMantissa.fMin.setIntDigitCount(2); | |
2755 // Scientific notation | |
2756 vf.prepareScientificFormatting( | |
2757 formatter, | |
2758 precision, | |
2759 options); | |
2760 { | |
2761 digits.set(-6396.5); | |
2762 verifyAffixesAndPadding( | |
2763 "-64.00E2", | |
2764 aap, | |
2765 digits, | |
2766 vf, | |
2767 NULL, NULL); | |
2768 } | |
2769 { | |
2770 digits.set(-0.00092374); | |
2771 verifyAffixesAndPadding( | |
2772 "-92.25E-5", | |
2773 aap, | |
2774 digits, | |
2775 vf, | |
2776 NULL, NULL); | |
2777 } | |
2778 precision.fMantissa.fMax.setIntDigitCount(3); | |
2779 { | |
2780 digits.set(-0.00092374); | |
2781 verifyAffixesAndPadding( | |
2782 "-923.80E-6", | |
2783 aap, | |
2784 digits, | |
2785 vf, | |
2786 NULL, NULL); | |
2787 } | |
2788 } | |
2789 | |
2790 void NumberFormat2Test::TestToPatternScientific11648() { | |
2791 /* | |
2792 UErrorCode status = U_ZERO_ERROR; | |
2793 Locale en("en"); | |
2794 DecimalFormat2 fmt(en, "0.00", status); | |
2795 fmt.setScientificNotation(TRUE); | |
2796 UnicodeString pattern; | |
2797 // Fails, produces "0.00E" | |
2798 assertEquals("", "0.00E0", fmt.toPattern(pattern)); | |
2799 DecimalFormat fmt2(pattern, status); | |
2800 // Fails, bad pattern. | |
2801 assertSuccess("", status); | |
2802 */ | |
2803 } | |
2804 | |
2805 void NumberFormat2Test::verifyAffixesAndPadding( | |
2806 const UnicodeString &expected, | |
2807 const DigitAffixesAndPadding &aaf, | |
2808 DigitList &digits, | |
2809 const ValueFormatter &vf, | |
2810 const PluralRules *optPluralRules, | |
2811 const NumberFormat2Test_Attributes *expectedAttributes) { | |
2812 UnicodeString appendTo; | |
2813 NumberFormat2Test_FieldPositionHandler handler; | |
2814 UErrorCode status = U_ZERO_ERROR; | |
2815 assertEquals( | |
2816 "", | |
2817 expected, | |
2818 aaf.format( | |
2819 digits, | |
2820 vf, | |
2821 handler, | |
2822 optPluralRules, | |
2823 appendTo, | |
2824 status)); | |
2825 if (!assertSuccess("", status)) { | |
2826 return; | |
2827 } | |
2828 if (expectedAttributes != NULL) { | |
2829 verifyAttributes(expectedAttributes, handler.attributes); | |
2830 } | |
2831 } | |
2832 | |
2833 void NumberFormat2Test::verifyAffixesAndPaddingInt32( | |
2834 const UnicodeString &expected, | |
2835 const DigitAffixesAndPadding &aaf, | |
2836 int32_t value, | |
2837 const ValueFormatter &vf, | |
2838 const PluralRules *optPluralRules, | |
2839 const NumberFormat2Test_Attributes *expectedAttributes) { | |
2840 UnicodeString appendTo; | |
2841 NumberFormat2Test_FieldPositionHandler handler; | |
2842 UErrorCode status = U_ZERO_ERROR; | |
2843 assertEquals( | |
2844 "", | |
2845 expected, | |
2846 aaf.formatInt32( | |
2847 value, | |
2848 vf, | |
2849 handler, | |
2850 optPluralRules, | |
2851 appendTo, | |
2852 status)); | |
2853 if (!assertSuccess("", status)) { | |
2854 return; | |
2855 } | |
2856 if (expectedAttributes != NULL) { | |
2857 verifyAttributes(expectedAttributes, handler.attributes); | |
2858 } | |
2859 DigitList digits; | |
2860 digits.set(value); | |
2861 verifyAffixesAndPadding( | |
2862 expected, aaf, digits, vf, optPluralRules, expectedAttributes); | |
2863 } | |
2864 | |
2865 void NumberFormat2Test::verifyAffix( | |
2866 const UnicodeString &expected, | |
2867 const DigitAffix &affix, | |
2868 const NumberFormat2Test_Attributes *expectedAttributes) { | |
2869 UnicodeString appendTo; | |
2870 NumberFormat2Test_FieldPositionHandler handler; | |
2871 assertEquals( | |
2872 "", | |
2873 expected.unescape(), | |
2874 affix.format(handler, appendTo)); | |
2875 if (expectedAttributes != NULL) { | |
2876 verifyAttributes(expectedAttributes, handler.attributes); | |
2877 } | |
2878 } | |
2879 | |
2880 // Right now only works for positive values. | |
2881 void NumberFormat2Test::verifyDigitList( | |
2882 const UnicodeString &expected, | |
2883 const DigitList &digits) { | |
2884 DigitFormatter formatter; | |
2885 DigitGrouping grouping; | |
2886 VisibleDigits visibleDigits; | |
2887 FixedPrecision precision; | |
2888 precision.fMin.setIntDigitCount(0); | |
2889 DigitFormatterOptions options; | |
2890 UErrorCode status = U_ZERO_ERROR; | |
2891 DigitList dlCopy(digits); | |
2892 precision.initVisibleDigits( | |
2893 dlCopy, visibleDigits, status); | |
2894 if (!assertSuccess("", status)) { | |
2895 return; | |
2896 } | |
2897 verifyDigitFormatter( | |
2898 expected, | |
2899 formatter, | |
2900 visibleDigits, | |
2901 grouping, | |
2902 options, | |
2903 NULL); | |
2904 } | |
2905 | |
2906 void NumberFormat2Test::verifyVisibleDigits( | |
2907 const UnicodeString &expected, | |
2908 UBool bNegative, | |
2909 const VisibleDigits &digits) { | |
2910 DigitFormatter formatter; | |
2911 DigitGrouping grouping; | |
2912 DigitFormatterOptions options; | |
2913 verifyDigitFormatter( | |
2914 expected, | |
2915 formatter, | |
2916 digits, | |
2917 grouping, | |
2918 options, | |
2919 NULL); | |
2920 if (digits.isNegative() != bNegative) { | |
2921 errln(expected + ": Wrong sign."); | |
2922 } | |
2923 if (digits.isNaN() || digits.isInfinite()) { | |
2924 errln(expected + ": Require real value."); | |
2925 } | |
2926 } | |
2927 | |
2928 void NumberFormat2Test::verifyVisibleDigitsWithExponent( | |
2929 const UnicodeString &expected, | |
2930 UBool bNegative, | |
2931 const VisibleDigitsWithExponent &digits) { | |
2932 DigitFormatter formatter; | |
2933 SciFormatterOptions options; | |
2934 verifySciFormatter( | |
2935 expected, | |
2936 formatter, | |
2937 digits, | |
2938 options, | |
2939 NULL); | |
2940 if (digits.isNegative() != bNegative) { | |
2941 errln(expected + ": Wrong sign."); | |
2942 } | |
2943 if (digits.isNaN() || digits.isInfinite()) { | |
2944 errln(expected + ": Require real value."); | |
2945 } | |
2946 } | |
2947 | |
2948 void NumberFormat2Test::verifySciFormatter( | |
2949 const UnicodeString &expected, | |
2950 const DigitFormatter &formatter, | |
2951 const VisibleDigitsWithExponent &digits, | |
2952 const SciFormatterOptions &options, | |
2953 const NumberFormat2Test_Attributes *expectedAttributes) { | |
2954 assertEquals( | |
2955 "", | |
2956 expected.countChar32(), | |
2957 formatter.countChar32(digits, options)); | |
2958 UnicodeString appendTo; | |
2959 NumberFormat2Test_FieldPositionHandler handler; | |
2960 assertEquals( | |
2961 "", | |
2962 expected, | |
2963 formatter.format( | |
2964 digits, | |
2965 options, | |
2966 handler, | |
2967 appendTo)); | |
2968 if (expectedAttributes != NULL) { | |
2969 verifyAttributes(expectedAttributes, handler.attributes); | |
2970 } | |
2971 } | |
2972 | |
2973 void NumberFormat2Test::verifyPositiveIntDigitFormatter( | |
2974 const UnicodeString &expected, | |
2975 const DigitFormatter &formatter, | |
2976 int32_t value, | |
2977 int32_t minDigits, | |
2978 int32_t maxDigits, | |
2979 const NumberFormat2Test_Attributes *expectedAttributes) { | |
2980 IntDigitCountRange range(minDigits, maxDigits); | |
2981 UnicodeString appendTo; | |
2982 NumberFormat2Test_FieldPositionHandler handler; | |
2983 assertEquals( | |
2984 "", | |
2985 expected, | |
2986 formatter.formatPositiveInt32( | |
2987 value, | |
2988 range, | |
2989 handler, | |
2990 appendTo)); | |
2991 if (expectedAttributes != NULL) { | |
2992 verifyAttributes(expectedAttributes, handler.attributes); | |
2993 } | |
2994 } | |
2995 | |
2996 void NumberFormat2Test::verifyDigitFormatter( | |
2997 const UnicodeString &expected, | |
2998 const DigitFormatter &formatter, | |
2999 const VisibleDigits &digits, | |
3000 const DigitGrouping &grouping, | |
3001 const DigitFormatterOptions &options, | |
3002 const NumberFormat2Test_Attributes *expectedAttributes) { | |
3003 assertEquals( | |
3004 "", | |
3005 expected.countChar32(), | |
3006 formatter.countChar32(digits, grouping, options)); | |
3007 UnicodeString appendTo; | |
3008 NumberFormat2Test_FieldPositionHandler handler; | |
3009 assertEquals( | |
3010 "", | |
3011 expected, | |
3012 formatter.format( | |
3013 digits, | |
3014 grouping, | |
3015 options, | |
3016 handler, | |
3017 appendTo)); | |
3018 if (expectedAttributes != NULL) { | |
3019 verifyAttributes(expectedAttributes, handler.attributes); | |
3020 } | |
3021 } | |
3022 | |
3023 void NumberFormat2Test::verifySmallIntFormatter( | |
3024 const UnicodeString &expected, | |
3025 int32_t positiveValue, | |
3026 int32_t minDigits, | |
3027 int32_t maxDigits) { | |
3028 IntDigitCountRange range(minDigits, maxDigits); | |
3029 if (!SmallIntFormatter::canFormat(positiveValue, range)) { | |
3030 UnicodeString actual; | |
3031 assertEquals("", expected, actual); | |
3032 return; | |
3033 } | |
3034 UnicodeString actual; | |
3035 assertEquals("", expected, SmallIntFormatter::format(positiveValue, range, a
ctual)); | |
3036 } | |
3037 | |
3038 void NumberFormat2Test::verifyAttributes( | |
3039 const NumberFormat2Test_Attributes *expected, | |
3040 const NumberFormat2Test_Attributes *actual) { | |
3041 int32_t idx = 0; | |
3042 while (expected[idx].spos != -1 && actual[idx].spos != -1) { | |
3043 assertEquals("id", expected[idx].id, actual[idx].id); | |
3044 assertEquals("spos", expected[idx].spos, actual[idx].spos); | |
3045 assertEquals("epos", expected[idx].epos, actual[idx].epos); | |
3046 ++idx; | |
3047 } | |
3048 assertEquals( | |
3049 "expected and actual not same length", | |
3050 expected[idx].spos, | |
3051 actual[idx].spos); | |
3052 } | |
3053 | |
3054 void NumberFormat2Test::verifyIntValue( | |
3055 int64_t expected, const VisibleDigits &digits) { | |
3056 double unusedSource; | |
3057 int64_t intValue; | |
3058 int64_t unusedF; | |
3059 int64_t unusedT; | |
3060 int32_t unusedV; | |
3061 UBool unusedHasIntValue; | |
3062 digits.getFixedDecimal( | |
3063 unusedSource, intValue, unusedF, | |
3064 unusedT, unusedV, unusedHasIntValue); | |
3065 assertEquals("", expected, intValue); | |
3066 } | |
3067 | |
3068 void NumberFormat2Test::verifySource( | |
3069 double expected, const VisibleDigits &digits) { | |
3070 double source; | |
3071 int64_t unusedIntValue; | |
3072 int64_t unusedF; | |
3073 int64_t unusedT; | |
3074 int32_t unusedV; | |
3075 UBool unusedHasIntValue; | |
3076 digits.getFixedDecimal( | |
3077 source, unusedIntValue, unusedF, | |
3078 unusedT, unusedV, unusedHasIntValue); | |
3079 if (expected != source) { | |
3080 errln("Expected %f, got %f instead", expected, source); | |
3081 } | |
3082 } | |
3083 | |
3084 extern IntlTest *createNumberFormat2Test() { | |
3085 return new NumberFormat2Test(); | |
3086 } | |
3087 | |
3088 #endif /* !UCONFIG_NO_FORMATTING */ | |
OLD | NEW |