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