| 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 |