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