1 /* 2 ******************************************************************************* 3 * Copyright (C) 2014-2015, International Business Machines Corporation and * 4 * others. All Rights Reserved. * 5 ******************************************************************************* 6 * 7 * File MEASFMTTEST.CPP 8 * 9 ******************************************************************************* 10 */ 11 #include <stdio.h> 12 #include <stdlib.h> 13 14 #include "intltest.h" 15 16 #if !UCONFIG_NO_FORMATTING 17 18 #include "unicode/decimfmt.h" 19 #include "unicode/measfmt.h" 20 #include "unicode/measure.h" 21 #include "unicode/measunit.h" 22 #include "unicode/tmunit.h" 23 #include "unicode/plurrule.h" 24 #include "charstr.h" 25 #include "unicode/reldatefmt.h" 26 27 struct ExpectedResult { 28 const Measure *measures; 29 int32_t count; 30 const char *expected; 31 }; 32 33 class MeasureFormatTest : public IntlTest { 34 public: 35 MeasureFormatTest() { 36 } 37 38 void runIndexedTest(int32_t index, UBool exec, const char *&name, char *par=0); 39 private: 40 void TestBasic(); 41 void TestCompatible53_1(); 42 void TestCompatible54_1(); 43 void TestGetAvailable(); 44 void TestExamplesInDocs(); 45 void TestFormatPeriodEn(); 46 void Test10219FractionalPlurals(); 47 void TestGreek(); 48 void TestFormatSingleArg(); 49 void TestFormatMeasuresZeroArg(); 50 void TestSimplePer(); 51 void TestNumeratorPlurals(); 52 void TestMultiples(); 53 void TestGram(); 54 void TestCurrencies(); 55 void TestFieldPosition(); 56 void TestFieldPositionMultiple(); 57 void TestBadArg(); 58 void TestEquality(); 59 void TestGroupingSeparator(); 60 void TestDoubleZero(); 61 void TestUnitPerUnitResolution(); 62 void verifyFormat( 63 const char *description, 64 const MeasureFormat &fmt, 65 const Measure *measures, 66 int32_t measureCount, 67 const char *expected); 68 void verifyFormatWithPrefix( 69 const char *description, 70 const MeasureFormat &fmt, 71 const UnicodeString &prefix, 72 const Measure *measures, 73 int32_t measureCount, 74 const char *expected); 75 void verifyFormat( 76 const char *description, 77 const MeasureFormat &fmt, 78 const ExpectedResult *expectedResults, 79 int32_t count); 80 void helperTestSimplePer( 81 const Locale &locale, 82 UMeasureFormatWidth width, 83 double value, 84 const MeasureUnit &unit, 85 const MeasureUnit &perUnit, 86 const char *expected); 87 void helperTestSimplePer( 88 const Locale &locale, 89 UMeasureFormatWidth width, 90 double value, 91 const MeasureUnit &unit, 92 const MeasureUnit &perUnit, 93 const char *expected, 94 int32_t field, 95 int32_t expected_start, 96 int32_t expected_end); 97 void helperTestMultiples( 98 const Locale &locale, 99 UMeasureFormatWidth width, 100 const char *expected); 101 void verifyFieldPosition( 102 const char *description, 103 const MeasureFormat &fmt, 104 const UnicodeString &prefix, 105 const Measure *measures, 106 int32_t measureCount, 107 NumberFormat::EAlignmentFields field, 108 int32_t start, 109 int32_t end); 110 }; 111 112 void MeasureFormatTest::runIndexedTest( 113 int32_t index, UBool exec, const char *&name, char *) { 114 if (exec) { 115 logln("TestSuite MeasureFormatTest: "); 116 } 117 TESTCASE_AUTO_BEGIN; 118 TESTCASE_AUTO(TestBasic); 119 TESTCASE_AUTO(TestCompatible53_1); 120 TESTCASE_AUTO(TestCompatible54_1); 121 TESTCASE_AUTO(TestGetAvailable); 122 TESTCASE_AUTO(TestExamplesInDocs); 123 TESTCASE_AUTO(TestFormatPeriodEn); 124 TESTCASE_AUTO(Test10219FractionalPlurals); 125 TESTCASE_AUTO(TestGreek); 126 TESTCASE_AUTO(TestFormatSingleArg); 127 TESTCASE_AUTO(TestFormatMeasuresZeroArg); 128 TESTCASE_AUTO(TestSimplePer); 129 TESTCASE_AUTO(TestNumeratorPlurals); 130 TESTCASE_AUTO(TestMultiples); 131 TESTCASE_AUTO(TestGram); 132 TESTCASE_AUTO(TestCurrencies); 133 TESTCASE_AUTO(TestFieldPosition); 134 TESTCASE_AUTO(TestFieldPositionMultiple); 135 TESTCASE_AUTO(TestBadArg); 136 TESTCASE_AUTO(TestEquality); 137 TESTCASE_AUTO(TestGroupingSeparator); 138 TESTCASE_AUTO(TestDoubleZero); 139 TESTCASE_AUTO(TestUnitPerUnitResolution); 140 TESTCASE_AUTO_END; 141 } 142 143 void MeasureFormatTest::TestCompatible53_1() { 144 UErrorCode status = U_ZERO_ERROR; 145 LocalPointer<MeasureUnit> measureUnit; 146 measureUnit.adoptInstead(MeasureUnit::createGForce(status)); 147 measureUnit.adoptInstead(MeasureUnit::createArcMinute(status)); 148 measureUnit.adoptInstead(MeasureUnit::createArcSecond(status)); 149 measureUnit.adoptInstead(MeasureUnit::createDegree(status)); 150 measureUnit.adoptInstead(MeasureUnit::createAcre(status)); 151 measureUnit.adoptInstead(MeasureUnit::createHectare(status)); 152 measureUnit.adoptInstead(MeasureUnit::createSquareFoot(status)); 153 measureUnit.adoptInstead(MeasureUnit::createSquareKilometer(status)); 154 measureUnit.adoptInstead(MeasureUnit::createSquareMeter(status)); 155 measureUnit.adoptInstead(MeasureUnit::createSquareMile(status)); 156 measureUnit.adoptInstead(MeasureUnit::createDay(status)); 157 measureUnit.adoptInstead(MeasureUnit::createHour(status)); 158 measureUnit.adoptInstead(MeasureUnit::createMillisecond(status)); 159 measureUnit.adoptInstead(MeasureUnit::createMinute(status)); 160 measureUnit.adoptInstead(MeasureUnit::createMonth(status)); 161 measureUnit.adoptInstead(MeasureUnit::createSecond(status)); 162 measureUnit.adoptInstead(MeasureUnit::createWeek(status)); 163 measureUnit.adoptInstead(MeasureUnit::createYear(status)); 164 measureUnit.adoptInstead(MeasureUnit::createCentimeter(status)); 165 measureUnit.adoptInstead(MeasureUnit::createFoot(status)); 166 measureUnit.adoptInstead(MeasureUnit::createInch(status)); 167 measureUnit.adoptInstead(MeasureUnit::createKilometer(status)); 168 measureUnit.adoptInstead(MeasureUnit::createLightYear(status)); 169 measureUnit.adoptInstead(MeasureUnit::createMeter(status)); 170 measureUnit.adoptInstead(MeasureUnit::createMile(status)); 171 measureUnit.adoptInstead(MeasureUnit::createMillimeter(status)); 172 measureUnit.adoptInstead(MeasureUnit::createPicometer(status)); 173 measureUnit.adoptInstead(MeasureUnit::createYard(status)); 174 measureUnit.adoptInstead(MeasureUnit::createGram(status)); 175 measureUnit.adoptInstead(MeasureUnit::createKilogram(status)); 176 measureUnit.adoptInstead(MeasureUnit::createOunce(status)); 177 measureUnit.adoptInstead(MeasureUnit::createPound(status)); 178 measureUnit.adoptInstead(MeasureUnit::createHorsepower(status)); 179 measureUnit.adoptInstead(MeasureUnit::createKilowatt(status)); 180 measureUnit.adoptInstead(MeasureUnit::createWatt(status)); 181 measureUnit.adoptInstead(MeasureUnit::createHectopascal(status)); 182 measureUnit.adoptInstead(MeasureUnit::createInchHg(status)); 183 measureUnit.adoptInstead(MeasureUnit::createMillibar(status)); 184 measureUnit.adoptInstead(MeasureUnit::createKilometerPerHour(status)); 185 measureUnit.adoptInstead(MeasureUnit::createMeterPerSecond(status)); 186 measureUnit.adoptInstead(MeasureUnit::createMilePerHour(status)); 187 measureUnit.adoptInstead(MeasureUnit::createCelsius(status)); 188 measureUnit.adoptInstead(MeasureUnit::createFahrenheit(status)); 189 measureUnit.adoptInstead(MeasureUnit::createCubicKilometer(status)); 190 measureUnit.adoptInstead(MeasureUnit::createCubicMile(status)); 191 measureUnit.adoptInstead(MeasureUnit::createLiter(status)); 192 assertSuccess("", status); 193 } 194 195 void MeasureFormatTest::TestCompatible54_1() { 196 UErrorCode status = U_ZERO_ERROR; 197 LocalPointer<MeasureUnit> measureUnit; 198 measureUnit.adoptInstead(MeasureUnit::createGForce(status)); 199 measureUnit.adoptInstead(MeasureUnit::createMeterPerSecondSquared(status)); 200 measureUnit.adoptInstead(MeasureUnit::createArcMinute(status)); 201 measureUnit.adoptInstead(MeasureUnit::createArcSecond(status)); 202 measureUnit.adoptInstead(MeasureUnit::createDegree(status)); 203 measureUnit.adoptInstead(MeasureUnit::createRadian(status)); 204 measureUnit.adoptInstead(MeasureUnit::createAcre(status)); 205 measureUnit.adoptInstead(MeasureUnit::createHectare(status)); 206 measureUnit.adoptInstead(MeasureUnit::createSquareCentimeter(status)); 207 measureUnit.adoptInstead(MeasureUnit::createSquareFoot(status)); 208 measureUnit.adoptInstead(MeasureUnit::createSquareInch(status)); 209 measureUnit.adoptInstead(MeasureUnit::createSquareKilometer(status)); 210 measureUnit.adoptInstead(MeasureUnit::createSquareMeter(status)); 211 measureUnit.adoptInstead(MeasureUnit::createSquareMile(status)); 212 measureUnit.adoptInstead(MeasureUnit::createSquareYard(status)); 213 measureUnit.adoptInstead(MeasureUnit::createLiterPerKilometer(status)); 214 measureUnit.adoptInstead(MeasureUnit::createMilePerGallon(status)); 215 measureUnit.adoptInstead(MeasureUnit::createBit(status)); 216 measureUnit.adoptInstead(MeasureUnit::createByte(status)); 217 measureUnit.adoptInstead(MeasureUnit::createGigabit(status)); 218 measureUnit.adoptInstead(MeasureUnit::createGigabyte(status)); 219 measureUnit.adoptInstead(MeasureUnit::createKilobit(status)); 220 measureUnit.adoptInstead(MeasureUnit::createKilobyte(status)); 221 measureUnit.adoptInstead(MeasureUnit::createMegabit(status)); 222 measureUnit.adoptInstead(MeasureUnit::createMegabyte(status)); 223 measureUnit.adoptInstead(MeasureUnit::createTerabit(status)); 224 measureUnit.adoptInstead(MeasureUnit::createTerabyte(status)); 225 measureUnit.adoptInstead(MeasureUnit::createDay(status)); 226 measureUnit.adoptInstead(MeasureUnit::createHour(status)); 227 measureUnit.adoptInstead(MeasureUnit::createMicrosecond(status)); 228 measureUnit.adoptInstead(MeasureUnit::createMillisecond(status)); 229 measureUnit.adoptInstead(MeasureUnit::createMinute(status)); 230 measureUnit.adoptInstead(MeasureUnit::createMonth(status)); 231 measureUnit.adoptInstead(MeasureUnit::createNanosecond(status)); 232 measureUnit.adoptInstead(MeasureUnit::createSecond(status)); 233 measureUnit.adoptInstead(MeasureUnit::createWeek(status)); 234 measureUnit.adoptInstead(MeasureUnit::createYear(status)); 235 measureUnit.adoptInstead(MeasureUnit::createAmpere(status)); 236 measureUnit.adoptInstead(MeasureUnit::createMilliampere(status)); 237 measureUnit.adoptInstead(MeasureUnit::createOhm(status)); 238 measureUnit.adoptInstead(MeasureUnit::createVolt(status)); 239 measureUnit.adoptInstead(MeasureUnit::createCalorie(status)); 240 measureUnit.adoptInstead(MeasureUnit::createFoodcalorie(status)); 241 measureUnit.adoptInstead(MeasureUnit::createJoule(status)); 242 measureUnit.adoptInstead(MeasureUnit::createKilocalorie(status)); 243 measureUnit.adoptInstead(MeasureUnit::createKilojoule(status)); 244 measureUnit.adoptInstead(MeasureUnit::createKilowattHour(status)); 245 measureUnit.adoptInstead(MeasureUnit::createGigahertz(status)); 246 measureUnit.adoptInstead(MeasureUnit::createHertz(status)); 247 measureUnit.adoptInstead(MeasureUnit::createKilohertz(status)); 248 measureUnit.adoptInstead(MeasureUnit::createMegahertz(status)); 249 measureUnit.adoptInstead(MeasureUnit::createAstronomicalUnit(status)); 250 measureUnit.adoptInstead(MeasureUnit::createCentimeter(status)); 251 measureUnit.adoptInstead(MeasureUnit::createDecimeter(status)); 252 measureUnit.adoptInstead(MeasureUnit::createFathom(status)); 253 measureUnit.adoptInstead(MeasureUnit::createFoot(status)); 254 measureUnit.adoptInstead(MeasureUnit::createFurlong(status)); 255 measureUnit.adoptInstead(MeasureUnit::createInch(status)); 256 measureUnit.adoptInstead(MeasureUnit::createKilometer(status)); 257 measureUnit.adoptInstead(MeasureUnit::createLightYear(status)); 258 measureUnit.adoptInstead(MeasureUnit::createMeter(status)); 259 measureUnit.adoptInstead(MeasureUnit::createMicrometer(status)); 260 measureUnit.adoptInstead(MeasureUnit::createMile(status)); 261 measureUnit.adoptInstead(MeasureUnit::createMillimeter(status)); 262 measureUnit.adoptInstead(MeasureUnit::createNanometer(status)); 263 measureUnit.adoptInstead(MeasureUnit::createNauticalMile(status)); 264 measureUnit.adoptInstead(MeasureUnit::createParsec(status)); 265 measureUnit.adoptInstead(MeasureUnit::createPicometer(status)); 266 measureUnit.adoptInstead(MeasureUnit::createYard(status)); 267 measureUnit.adoptInstead(MeasureUnit::createLux(status)); 268 measureUnit.adoptInstead(MeasureUnit::createCarat(status)); 269 measureUnit.adoptInstead(MeasureUnit::createGram(status)); 270 measureUnit.adoptInstead(MeasureUnit::createKilogram(status)); 271 measureUnit.adoptInstead(MeasureUnit::createMetricTon(status)); 272 measureUnit.adoptInstead(MeasureUnit::createMicrogram(status)); 273 measureUnit.adoptInstead(MeasureUnit::createMilligram(status)); 274 measureUnit.adoptInstead(MeasureUnit::createOunce(status)); 275 measureUnit.adoptInstead(MeasureUnit::createOunceTroy(status)); 276 measureUnit.adoptInstead(MeasureUnit::createPound(status)); 277 measureUnit.adoptInstead(MeasureUnit::createStone(status)); 278 measureUnit.adoptInstead(MeasureUnit::createTon(status)); 279 measureUnit.adoptInstead(MeasureUnit::createGigawatt(status)); 280 measureUnit.adoptInstead(MeasureUnit::createHorsepower(status)); 281 measureUnit.adoptInstead(MeasureUnit::createKilowatt(status)); 282 measureUnit.adoptInstead(MeasureUnit::createMegawatt(status)); 283 measureUnit.adoptInstead(MeasureUnit::createMilliwatt(status)); 284 measureUnit.adoptInstead(MeasureUnit::createWatt(status)); 285 measureUnit.adoptInstead(MeasureUnit::createHectopascal(status)); 286 measureUnit.adoptInstead(MeasureUnit::createInchHg(status)); 287 measureUnit.adoptInstead(MeasureUnit::createMillibar(status)); 288 measureUnit.adoptInstead(MeasureUnit::createMillimeterOfMercury(status)); 289 measureUnit.adoptInstead(MeasureUnit::createPoundPerSquareInch(status)); 290 measureUnit.adoptInstead(MeasureUnit::createKarat(status)); 291 measureUnit.adoptInstead(MeasureUnit::createKilometerPerHour(status)); 292 measureUnit.adoptInstead(MeasureUnit::createMeterPerSecond(status)); 293 measureUnit.adoptInstead(MeasureUnit::createMilePerHour(status)); 294 measureUnit.adoptInstead(MeasureUnit::createCelsius(status)); 295 measureUnit.adoptInstead(MeasureUnit::createFahrenheit(status)); 296 measureUnit.adoptInstead(MeasureUnit::createKelvin(status)); 297 measureUnit.adoptInstead(MeasureUnit::createAcreFoot(status)); 298 measureUnit.adoptInstead(MeasureUnit::createBushel(status)); 299 measureUnit.adoptInstead(MeasureUnit::createCentiliter(status)); 300 measureUnit.adoptInstead(MeasureUnit::createCubicCentimeter(status)); 301 measureUnit.adoptInstead(MeasureUnit::createCubicFoot(status)); 302 measureUnit.adoptInstead(MeasureUnit::createCubicInch(status)); 303 measureUnit.adoptInstead(MeasureUnit::createCubicKilometer(status)); 304 measureUnit.adoptInstead(MeasureUnit::createCubicMeter(status)); 305 measureUnit.adoptInstead(MeasureUnit::createCubicMile(status)); 306 measureUnit.adoptInstead(MeasureUnit::createCubicYard(status)); 307 measureUnit.adoptInstead(MeasureUnit::createCup(status)); 308 measureUnit.adoptInstead(MeasureUnit::createDeciliter(status)); 309 measureUnit.adoptInstead(MeasureUnit::createFluidOunce(status)); 310 measureUnit.adoptInstead(MeasureUnit::createGallon(status)); 311 measureUnit.adoptInstead(MeasureUnit::createHectoliter(status)); 312 measureUnit.adoptInstead(MeasureUnit::createLiter(status)); 313 measureUnit.adoptInstead(MeasureUnit::createMegaliter(status)); 314 measureUnit.adoptInstead(MeasureUnit::createMilliliter(status)); 315 measureUnit.adoptInstead(MeasureUnit::createPint(status)); 316 measureUnit.adoptInstead(MeasureUnit::createQuart(status)); 317 measureUnit.adoptInstead(MeasureUnit::createTablespoon(status)); 318 measureUnit.adoptInstead(MeasureUnit::createTeaspoon(status)); 319 assertSuccess("", status); 320 } 321 322 void MeasureFormatTest::TestBasic() { 323 UErrorCode status = U_ZERO_ERROR; 324 MeasureUnit *ptr1 = MeasureUnit::createArcMinute(status); 325 MeasureUnit *ptr2 = MeasureUnit::createArcMinute(status); 326 if (!(*ptr1 == *ptr2)) { 327 errln("Expect == to work."); 328 } 329 if (*ptr1 != *ptr2) { 330 errln("Expect != to work."); 331 } 332 MeasureUnit *ptr3 = MeasureUnit::createMeter(status); 333 if (*ptr1 == *ptr3) { 334 errln("Expect == to work."); 335 } 336 if (!(*ptr1 != *ptr3)) { 337 errln("Expect != to work."); 338 } 339 MeasureUnit *ptr4 = (MeasureUnit *) ptr1->clone(); 340 if (*ptr1 != *ptr4) { 341 errln("Expect clone to work."); 342 } 343 MeasureUnit stack; 344 stack = *ptr1; 345 if (*ptr1 != stack) { 346 errln("Expect assignment to work."); 347 } 348 349 delete ptr1; 350 delete ptr2; 351 delete ptr3; 352 delete ptr4; 353 } 354 355 void MeasureFormatTest::TestGetAvailable() { 356 MeasureUnit *units = NULL; 357 UErrorCode status = U_ZERO_ERROR; 358 int32_t totalCount = MeasureUnit::getAvailable(units, 0, status); 359 while (status == U_BUFFER_OVERFLOW_ERROR) { 360 status = U_ZERO_ERROR; 361 delete [] units; 362 units = new MeasureUnit[totalCount]; 363 totalCount = MeasureUnit::getAvailable(units, totalCount, status); 364 } 365 if (U_FAILURE(status)) { 366 dataerrln("Failure creating format object - %s", u_errorName(status)); 367 delete [] units; 368 return; 369 } 370 if (totalCount < 200) { 371 errln("Expect at least 200 measure units including currencies."); 372 } 373 delete [] units; 374 StringEnumeration *types = MeasureUnit::getAvailableTypes(status); 375 if (U_FAILURE(status)) { 376 dataerrln("Failure getting types - %s", u_errorName(status)); 377 delete types; 378 return; 379 } 380 if (types->count(status) < 10) { 381 errln("Expect at least 10 distinct unit types."); 382 } 383 units = NULL; 384 int32_t unitCapacity = 0; 385 int32_t unitCountSum = 0; 386 for ( 387 const char* type = types->next(NULL, status); 388 type != NULL; 389 type = types->next(NULL, status)) { 390 int32_t unitCount = MeasureUnit::getAvailable(type, units, unitCapacity, status); 391 while (status == U_BUFFER_OVERFLOW_ERROR) { 392 status = U_ZERO_ERROR; 393 delete [] units; 394 units = new MeasureUnit[unitCount]; 395 unitCapacity = unitCount; 396 unitCount = MeasureUnit::getAvailable(type, units, unitCapacity, status); 397 } 398 if (U_FAILURE(status)) { 399 dataerrln("Failure getting units - %s", u_errorName(status)); 400 delete [] units; 401 delete types; 402 return; 403 } 404 if (unitCount < 1) { 405 errln("Expect at least one unit count per type."); 406 } 407 unitCountSum += unitCount; 408 } 409 if (unitCountSum != totalCount) { 410 errln("Expected total unit count to equal sum of unit counts by type."); 411 } 412 delete [] units; 413 delete types; 414 } 415 416 void MeasureFormatTest::TestExamplesInDocs() { 417 UErrorCode status = U_ZERO_ERROR; 418 MeasureFormat fmtFr(Locale::getFrench(), UMEASFMT_WIDTH_SHORT, status); 419 MeasureFormat fmtFrFull( 420 Locale::getFrench(), UMEASFMT_WIDTH_WIDE, status); 421 MeasureFormat fmtFrNarrow( 422 Locale::getFrench(), UMEASFMT_WIDTH_NARROW, status); 423 MeasureFormat fmtEn(Locale::getUS(), UMEASFMT_WIDTH_WIDE, status); 424 if (!assertSuccess("Error creating formatters", status)) { 425 return; 426 } 427 Measure measureC(23, MeasureUnit::createCelsius(status), status); 428 Measure measureF(70, MeasureUnit::createFahrenheit(status), status); 429 Measure feetAndInches[] = { 430 Measure(70, MeasureUnit::createFoot(status), status), 431 Measure(5.3, MeasureUnit::createInch(status), status)}; 432 Measure footAndInch[] = { 433 Measure(1, MeasureUnit::createFoot(status), status), 434 Measure(1, MeasureUnit::createInch(status), status)}; 435 Measure inchAndFeet[] = { 436 Measure(1, MeasureUnit::createInch(status), status), 437 Measure(2, MeasureUnit::createFoot(status), status)}; 438 if (!assertSuccess("Error creating measurements.", status)) { 439 return; 440 } 441 verifyFormat( 442 "Celsius", 443 fmtFr, 444 &measureC, 445 1, 446 "23 \\u00B0C"); 447 verifyFormatWithPrefix( 448 "Celsius", 449 fmtFr, 450 "Prefix: ", 451 &measureC, 452 1, 453 "Prefix: 23 \\u00B0C"); 454 verifyFormat( 455 "Fahrenheit", 456 fmtFr, 457 &measureF, 458 1, 459 "70 \\u00B0F"); 460 verifyFormat( 461 "Feet and inches", 462 fmtFrFull, 463 feetAndInches, 464 UPRV_LENGTHOF(feetAndInches), 465 "70 pieds et 5,3 pouces"); 466 verifyFormatWithPrefix( 467 "Feet and inches", 468 fmtFrFull, 469 "Prefix: ", 470 feetAndInches, 471 UPRV_LENGTHOF(feetAndInches), 472 "Prefix: 70 pieds et 5,3 pouces"); 473 verifyFormat( 474 "Foot and inch", 475 fmtFrFull, 476 footAndInch, 477 UPRV_LENGTHOF(footAndInch), 478 "1 pied et 1 pouce"); 479 verifyFormat( 480 "Foot and inch narrow", 481 fmtFrNarrow, 482 footAndInch, 483 UPRV_LENGTHOF(footAndInch), 484 "1\\u2032 1\\u2033"); 485 verifyFormat( 486 "Inch and feet", 487 fmtEn, 488 inchAndFeet, 489 UPRV_LENGTHOF(inchAndFeet), 490 "1 inch, 2 feet"); 491 } 492 493 void MeasureFormatTest::TestFormatPeriodEn() { 494 UErrorCode status = U_ZERO_ERROR; 495 Measure t_19m[] = {Measure(19, MeasureUnit::createMinute(status), status)}; 496 Measure t_1h_23_5s[] = { 497 Measure(1.0, MeasureUnit::createHour(status), status), 498 Measure(23.5, MeasureUnit::createSecond(status), status) 499 }; 500 Measure t_1h_23_5m[] = { 501 Measure(1.0, MeasureUnit::createHour(status), status), 502 Measure(23.5, MeasureUnit::createMinute(status), status) 503 }; 504 Measure t_1h_0m_23s[] = { 505 Measure( 506 1.0, 507 TimeUnit::createInstance( 508 TimeUnit::UTIMEUNIT_HOUR, status), 509 status), 510 Measure( 511 0.0, 512 TimeUnit::createInstance( 513 TimeUnit::UTIMEUNIT_MINUTE, status), 514 status), 515 Measure( 516 23, 517 TimeUnit::createInstance( 518 TimeUnit::UTIMEUNIT_SECOND, status), 519 status) 520 }; 521 Measure t_2y_5M_3w_4d[] = { 522 Measure(2.0, MeasureUnit::createYear(status), status), 523 Measure(5.0, MeasureUnit::createMonth(status), status), 524 Measure(3.0, MeasureUnit::createWeek(status), status), 525 Measure(4.0, MeasureUnit::createDay(status), status) 526 }; 527 Measure t_1m_59_9996s[] = { 528 Measure(1.0, MeasureUnit::createMinute(status), status), 529 Measure(59.9996, MeasureUnit::createSecond(status), status) 530 }; 531 Measure t_5h_17m[] = { 532 Measure(5.0, MeasureUnit::createHour(status), status), 533 Measure(17.0, MeasureUnit::createMinute(status), status) 534 }; 535 Measure t_neg5h_17m[] = { 536 Measure(-5.0, MeasureUnit::createHour(status), status), 537 Measure(17.0, MeasureUnit::createMinute(status), status) 538 }; 539 Measure t_19m_28s[] = { 540 Measure(19.0, MeasureUnit::createMinute(status), status), 541 Measure(28.0, MeasureUnit::createSecond(status), status) 542 }; 543 Measure t_0h_0m_9s[] = { 544 Measure(0.0, MeasureUnit::createHour(status), status), 545 Measure(0.0, MeasureUnit::createMinute(status), status), 546 Measure(9.0, MeasureUnit::createSecond(status), status) 547 }; 548 Measure t_0h_0m_17s[] = { 549 Measure(0.0, MeasureUnit::createHour(status), status), 550 Measure(0.0, MeasureUnit::createMinute(status), status), 551 Measure(17.0, MeasureUnit::createSecond(status), status) 552 }; 553 Measure t_6h_56_92m[] = { 554 Measure(6.0, MeasureUnit::createHour(status), status), 555 Measure(56.92, MeasureUnit::createMinute(status), status) 556 }; 557 Measure t_3h_4s_5m[] = { 558 Measure(3.0, MeasureUnit::createHour(status), status), 559 Measure(4.0, MeasureUnit::createSecond(status), status), 560 Measure(5.0, MeasureUnit::createMinute(status), status) 561 }; 562 Measure t_6_7h_56_92m[] = { 563 Measure(6.7, MeasureUnit::createHour(status), status), 564 Measure(56.92, MeasureUnit::createMinute(status), status) 565 }; 566 567 Measure t_3h_5h[] = { 568 Measure(3.0, MeasureUnit::createHour(status), status), 569 Measure(5.0, MeasureUnit::createHour(status), status) 570 }; 571 572 if (!assertSuccess("Error creating Measure objects", status)) { 573 return; 574 } 575 576 ExpectedResult fullData[] = { 577 {t_1m_59_9996s, UPRV_LENGTHOF(t_1m_59_9996s), "1 minute, 59.9996 seconds"}, 578 {t_19m, UPRV_LENGTHOF(t_19m), "19 minutes"}, 579 {t_1h_23_5s, UPRV_LENGTHOF(t_1h_23_5s), "1 hour, 23.5 seconds"}, 580 {t_1h_23_5m, UPRV_LENGTHOF(t_1h_23_5m), "1 hour, 23.5 minutes"}, 581 {t_1h_0m_23s, UPRV_LENGTHOF(t_1h_0m_23s), "1 hour, 0 minutes, 23 seconds"}, 582 {t_2y_5M_3w_4d, UPRV_LENGTHOF(t_2y_5M_3w_4d), "2 years, 5 months, 3 weeks, 4 days"}}; 583 584 ExpectedResult abbrevData[] = { 585 {t_1m_59_9996s, UPRV_LENGTHOF(t_1m_59_9996s), "1 min, 59.9996 sec"}, 586 {t_19m, UPRV_LENGTHOF(t_19m), "19 min"}, 587 {t_1h_23_5s, UPRV_LENGTHOF(t_1h_23_5s), "1 hr, 23.5 sec"}, 588 {t_1h_23_5m, UPRV_LENGTHOF(t_1h_23_5m), "1 hr, 23.5 min"}, 589 {t_1h_0m_23s, UPRV_LENGTHOF(t_1h_0m_23s), "1 hr, 0 min, 23 sec"}, 590 {t_2y_5M_3w_4d, UPRV_LENGTHOF(t_2y_5M_3w_4d), "2 yrs, 5 mths, 3 wks, 4 days"}}; 591 592 ExpectedResult narrowData[] = { 593 {t_1m_59_9996s, UPRV_LENGTHOF(t_1m_59_9996s), "1m 59.9996s"}, 594 {t_19m, UPRV_LENGTHOF(t_19m), "19m"}, 595 {t_1h_23_5s, UPRV_LENGTHOF(t_1h_23_5s), "1h 23.5s"}, 596 {t_1h_23_5m, UPRV_LENGTHOF(t_1h_23_5m), "1h 23.5m"}, 597 {t_1h_0m_23s, UPRV_LENGTHOF(t_1h_0m_23s), "1h 0m 23s"}, 598 {t_2y_5M_3w_4d, UPRV_LENGTHOF(t_2y_5M_3w_4d), "2y 5m 3w 4d"}}; 599 600 ExpectedResult numericData[] = { 601 {t_1m_59_9996s, UPRV_LENGTHOF(t_1m_59_9996s), "1:59.9996"}, 602 {t_19m, UPRV_LENGTHOF(t_19m), "19m"}, 603 {t_1h_23_5s, UPRV_LENGTHOF(t_1h_23_5s), "1:00:23.5"}, 604 {t_1h_23_5m, UPRV_LENGTHOF(t_1h_23_5m), "1:23.5"}, 605 {t_1h_0m_23s, UPRV_LENGTHOF(t_1h_0m_23s), "1:00:23"}, 606 {t_5h_17m, UPRV_LENGTHOF(t_5h_17m), "5:17"}, 607 {t_neg5h_17m, UPRV_LENGTHOF(t_neg5h_17m), "-5h 17m"}, 608 {t_19m_28s, UPRV_LENGTHOF(t_19m_28s), "19:28"}, 609 {t_2y_5M_3w_4d, UPRV_LENGTHOF(t_2y_5M_3w_4d), "2y 5m 3w 4d"}, 610 {t_0h_0m_9s, UPRV_LENGTHOF(t_0h_0m_9s), "0:00:09"}, 611 {t_6h_56_92m, UPRV_LENGTHOF(t_6h_56_92m), "6:56.92"}, 612 {t_6_7h_56_92m, UPRV_LENGTHOF(t_6_7h_56_92m), "6:56.92"}, 613 {t_3h_4s_5m, UPRV_LENGTHOF(t_3h_4s_5m), "3h 4s 5m"}, 614 {t_3h_5h, UPRV_LENGTHOF(t_3h_5h), "3h 5h"}}; 615 616 ExpectedResult fullDataDe[] = { 617 {t_1m_59_9996s, UPRV_LENGTHOF(t_1m_59_9996s), "1 Minute und 59,9996 Sekunden"}, 618 {t_19m, UPRV_LENGTHOF(t_19m), "19 Minuten"}, 619 {t_1h_23_5s, UPRV_LENGTHOF(t_1h_23_5s), "1 Stunde und 23,5 Sekunden"}, 620 {t_1h_23_5m, UPRV_LENGTHOF(t_1h_23_5m), "1 Stunde und 23,5 Minuten"}, 621 {t_1h_0m_23s, UPRV_LENGTHOF(t_1h_0m_23s), "1 Stunde, 0 Minuten und 23 Sekunden"}, 622 {t_2y_5M_3w_4d, UPRV_LENGTHOF(t_2y_5M_3w_4d), "2 Jahre, 5 Monate, 3 Wochen und 4 Tage"}}; 623 624 ExpectedResult numericDataDe[] = { 625 {t_1m_59_9996s, UPRV_LENGTHOF(t_1m_59_9996s), "1:59,9996"}, 626 {t_19m, UPRV_LENGTHOF(t_19m), "19 Min."}, 627 {t_1h_23_5s, UPRV_LENGTHOF(t_1h_23_5s), "1:00:23,5"}, 628 {t_1h_23_5m, UPRV_LENGTHOF(t_1h_23_5m), "1:23,5"}, 629 {t_1h_0m_23s, UPRV_LENGTHOF(t_1h_0m_23s), "1:00:23"}, 630 {t_5h_17m, UPRV_LENGTHOF(t_5h_17m), "5:17"}, 631 {t_19m_28s, UPRV_LENGTHOF(t_19m_28s), "19:28"}, 632 {t_2y_5M_3w_4d, UPRV_LENGTHOF(t_2y_5M_3w_4d), "2 J, 5 M, 3 W und 4 T"}, 633 {t_0h_0m_17s, UPRV_LENGTHOF(t_0h_0m_17s), "0:00:17"}, 634 {t_6h_56_92m, UPRV_LENGTHOF(t_6h_56_92m), "6:56,92"}, 635 {t_3h_5h, UPRV_LENGTHOF(t_3h_5h), "3 Std., 5 Std."}}; 636 637 Locale en(Locale::getEnglish()); 638 LocalPointer<NumberFormat> nf(NumberFormat::createInstance(en, status)); 639 if (U_FAILURE(status)) { 640 dataerrln("Error creating number format en object - %s", u_errorName(status)); 641 return; 642 } 643 nf->setMaximumFractionDigits(4); 644 MeasureFormat mf(en, UMEASFMT_WIDTH_WIDE, (NumberFormat *) nf->clone(), status); 645 if (!assertSuccess("Error creating measure format en WIDE", status)) { 646 return; 647 } 648 verifyFormat("en WIDE", mf, fullData, UPRV_LENGTHOF(fullData)); 649 650 // exercise copy constructor 651 { 652 MeasureFormat mf2(mf); 653 verifyFormat("en WIDE copy", mf2, fullData, UPRV_LENGTHOF(fullData)); 654 } 655 // exercise clone 656 { 657 MeasureFormat *mf3 = (MeasureFormat *) mf.clone(); 658 verifyFormat("en WIDE copy", *mf3, fullData, UPRV_LENGTHOF(fullData)); 659 delete mf3; 660 } 661 mf = MeasureFormat(en, UMEASFMT_WIDTH_SHORT, (NumberFormat *) nf->clone(), status); 662 if (!assertSuccess("Error creating measure format en SHORT", status)) { 663 return; 664 } 665 verifyFormat("en SHORT", mf, abbrevData, UPRV_LENGTHOF(abbrevData)); 666 mf = MeasureFormat(en, UMEASFMT_WIDTH_NARROW, (NumberFormat *) nf->clone(), status); 667 if (!assertSuccess("Error creating measure format en NARROW", status)) { 668 return; 669 } 670 verifyFormat("en NARROW", mf, narrowData, UPRV_LENGTHOF(narrowData)); 671 mf = MeasureFormat(en, UMEASFMT_WIDTH_NUMERIC, (NumberFormat *) nf->clone(), status); 672 if (!assertSuccess("Error creating measure format en NUMERIC", status)) { 673 return; 674 } 675 verifyFormat("en NUMERIC", mf, numericData, UPRV_LENGTHOF(numericData)); 676 677 Locale de(Locale::getGerman()); 678 nf.adoptInstead(NumberFormat::createInstance(de, status)); 679 if (!assertSuccess("Error creating number format de object", status)) { 680 return; 681 } 682 nf->setMaximumFractionDigits(4); 683 mf = MeasureFormat(de, UMEASFMT_WIDTH_WIDE, (NumberFormat *) nf->clone(), status); 684 if (!assertSuccess("Error creating measure format de WIDE", status)) { 685 return; 686 } 687 verifyFormat("de WIDE", mf, fullDataDe, UPRV_LENGTHOF(fullDataDe)); 688 mf = MeasureFormat(de, UMEASFMT_WIDTH_NUMERIC, (NumberFormat *) nf->clone(), status); 689 if (!assertSuccess("Error creating measure format de NUMERIC", status)) { 690 return; 691 } 692 verifyFormat("de NUMERIC", mf, numericDataDe, UPRV_LENGTHOF(numericDataDe)); 693 } 694 695 void MeasureFormatTest::Test10219FractionalPlurals() { 696 Locale en(Locale::getEnglish()); 697 double values[] = {1.588, 1.011}; 698 const char *expected[2][3] = { 699 {"1 minute", "1.5 minutes", "1.58 minutes"}, 700 {"1 minute", "1.0 minutes", "1.01 minutes"} 701 }; 702 UErrorCode status = U_ZERO_ERROR; 703 for (int j = 0; j < UPRV_LENGTHOF(values); j++) { 704 for (int i = 0; i < UPRV_LENGTHOF(expected[j]); i++) { 705 DecimalFormat *df = 706 (DecimalFormat *) NumberFormat::createInstance(en, status); 707 if (U_FAILURE(status)) { 708 dataerrln("Error creating Number format - %s", u_errorName(status)); 709 return; 710 } 711 df->setRoundingMode(DecimalFormat::kRoundDown); 712 df->setMinimumFractionDigits(i); 713 df->setMaximumFractionDigits(i); 714 MeasureFormat mf(en, UMEASFMT_WIDTH_WIDE, df, status); 715 if (!assertSuccess("Error creating Measure format", status)) { 716 return; 717 } 718 Measure measure(values[j], MeasureUnit::createMinute(status), status); 719 if (!assertSuccess("Error creating Measure unit", status)) { 720 return; 721 } 722 verifyFormat("Test10219", mf, &measure, 1, expected[j][i]); 723 } 724 } 725 } 726 727 static MeasureUnit toMeasureUnit(MeasureUnit *adopted) { 728 MeasureUnit result(*adopted); 729 delete adopted; 730 return result; 731 } 732 733 void MeasureFormatTest::TestGreek() { 734 Locale locales[] = {Locale("el_GR"), Locale("el")}; 735 UErrorCode status = U_ZERO_ERROR; 736 MeasureUnit units[] = { 737 toMeasureUnit(MeasureUnit::createSecond(status)), 738 toMeasureUnit(MeasureUnit::createMinute(status)), 739 toMeasureUnit(MeasureUnit::createHour(status)), 740 toMeasureUnit(MeasureUnit::createDay(status)), 741 toMeasureUnit(MeasureUnit::createWeek(status)), 742 toMeasureUnit(MeasureUnit::createMonth(status)), 743 toMeasureUnit(MeasureUnit::createYear(status))}; 744 if (!assertSuccess("Error creating Measure units", status)) { 745 return; 746 } 747 UMeasureFormatWidth styles[] = { 748 UMEASFMT_WIDTH_WIDE, 749 UMEASFMT_WIDTH_SHORT}; 750 int32_t numbers[] = {1, 7}; 751 const char *expected[] = { 752 // "el_GR" 1 wide 753 "1 \\u03B4\\u03B5\\u03C5\\u03C4\\u03B5\\u03C1\\u03CC\\u03BB\\u03B5\\u03C0\\u03C4\\u03BF", 754 "1 \\u03BB\\u03B5\\u03C0\\u03C4\\u03CC", 755 "1 \\u03CE\\u03C1\\u03B1", 756 "1 \\u03B7\\u03BC\\u03AD\\u03C1\\u03B1", 757 "1 \\u03B5\\u03B2\\u03B4\\u03BF\\u03BC\\u03AC\\u03B4\\u03B1", 758 "1 \\u03BC\\u03AE\\u03BD\\u03B1\\u03C2", 759 "1 \\u03AD\\u03C4\\u03BF\\u03C2", 760 // "el_GR" 1 short 761 "1 \\u03B4\\u03B5\\u03C5\\u03C4.", 762 "1 \\u03BB\\u03B5\\u03C0.", 763 "1 \\u03CE\\u03C1\\u03B1", 764 "1 \\u03B7\\u03BC\\u03AD\\u03C1\\u03B1", 765 "1 \\u03B5\\u03B2\\u03B4.", 766 "1 \\u03BC\\u03AE\\u03BD.", 767 "1 \\u03AD\\u03C4.", // year (one) 768 // "el_GR" 7 wide 769 "7 \\u03B4\\u03B5\\u03C5\\u03C4\\u03B5\\u03C1\\u03CC\\u03BB\\u03B5\\u03C0\\u03C4\\u03B1", 770 "7 \\u03BB\\u03B5\\u03C0\\u03C4\\u03AC", 771 "7 \\u03CE\\u03C1\\u03B5\\u03C2", 772 "7 \\u03B7\\u03BC\\u03AD\\u03C1\\u03B5\\u03C2", 773 "7 \\u03B5\\u03B2\\u03B4\\u03BF\\u03BC\\u03AC\\u03B4\\u03B5\\u03C2", 774 "7 \\u03BC\\u03AE\\u03BD\\u03B5\\u03C2", 775 "7 \\u03AD\\u03C4\\u03B7", 776 // "el_GR" 7 short 777 "7 \\u03B4\\u03B5\\u03C5\\u03C4.", 778 "7 \\u03BB\\u03B5\\u03C0.", 779 "7 \\u03CE\\u03C1.", // hour (other) 780 "7 \\u03B7\\u03BC\\u03AD\\u03C1\\u03B5\\u03C2", 781 "7 \\u03B5\\u03B2\\u03B4.", 782 "7 \\u03BC\\u03AE\\u03BD.", 783 "7 \\u03AD\\u03C4.", // year (other) 784 785 // "el" 1 wide 786 "1 \\u03B4\\u03B5\\u03C5\\u03C4\\u03B5\\u03C1\\u03CC\\u03BB\\u03B5\\u03C0\\u03C4\\u03BF", 787 "1 \\u03BB\\u03B5\\u03C0\\u03C4\\u03CC", 788 "1 \\u03CE\\u03C1\\u03B1", 789 "1 \\u03B7\\u03BC\\u03AD\\u03C1\\u03B1", 790 "1 \\u03B5\\u03B2\\u03B4\\u03BF\\u03BC\\u03AC\\u03B4\\u03B1", 791 "1 \\u03BC\\u03AE\\u03BD\\u03B1\\u03C2", 792 "1 \\u03AD\\u03C4\\u03BF\\u03C2", 793 // "el" 1 short 794 "1 \\u03B4\\u03B5\\u03C5\\u03C4.", 795 "1 \\u03BB\\u03B5\\u03C0.", 796 "1 \\u03CE\\u03C1\\u03B1", 797 "1 \\u03B7\\u03BC\\u03AD\\u03C1\\u03B1", 798 "1 \\u03B5\\u03B2\\u03B4.", 799 "1 \\u03BC\\u03AE\\u03BD.", 800 "1 \\u03AD\\u03C4.", // year (one) 801 // "el" 7 wide 802 "7 \\u03B4\\u03B5\\u03C5\\u03C4\\u03B5\\u03C1\\u03CC\\u03BB\\u03B5\\u03C0\\u03C4\\u03B1", 803 "7 \\u03BB\\u03B5\\u03C0\\u03C4\\u03AC", 804 "7 \\u03CE\\u03C1\\u03B5\\u03C2", 805 "7 \\u03B7\\u03BC\\u03AD\\u03C1\\u03B5\\u03C2", 806 "7 \\u03B5\\u03B2\\u03B4\\u03BF\\u03BC\\u03AC\\u03B4\\u03B5\\u03C2", 807 "7 \\u03BC\\u03AE\\u03BD\\u03B5\\u03C2", 808 "7 \\u03AD\\u03C4\\u03B7", 809 // "el" 7 short 810 "7 \\u03B4\\u03B5\\u03C5\\u03C4.", 811 "7 \\u03BB\\u03B5\\u03C0.", 812 "7 \\u03CE\\u03C1.", // hour (other) 813 "7 \\u03B7\\u03BC\\u03AD\\u03C1\\u03B5\\u03C2", 814 "7 \\u03B5\\u03B2\\u03B4.", 815 "7 \\u03BC\\u03AE\\u03BD.", 816 "7 \\u03AD\\u03C4."}; // year (other) 817 818 int32_t counter = 0; 819 for (int32_t locIndex = 0; locIndex < UPRV_LENGTHOF(locales); ++locIndex ) { 820 for( int32_t numIndex = 0; numIndex < UPRV_LENGTHOF(numbers); ++numIndex ) { 821 for ( int32_t styleIndex = 0; styleIndex < UPRV_LENGTHOF(styles); ++styleIndex ) { 822 for ( int32_t unitIndex = 0; unitIndex < UPRV_LENGTHOF(units); ++unitIndex ) { 823 Measure measure(numbers[numIndex], new MeasureUnit(units[unitIndex]), status); 824 if (!assertSuccess("Error creating Measure", status)) { 825 return; 826 } 827 MeasureFormat fmt(locales[locIndex], styles[styleIndex], status); 828 if (!assertSuccess("Error creating Measure format", status)) { 829 return; 830 } 831 verifyFormat("TestGreek", fmt, &measure, 1, expected[counter]); 832 ++counter; 833 } 834 } 835 } 836 } 837 } 838 839 void MeasureFormatTest::TestFormatSingleArg() { 840 UErrorCode status = U_ZERO_ERROR; 841 MeasureFormat fmt("en", UMEASFMT_WIDTH_WIDE, status); 842 if (!assertSuccess("Error creating formatter", status)) { 843 return; 844 } 845 UnicodeString buffer; 846 FieldPosition pos(0); 847 fmt.format( 848 new Measure(3.5, MeasureUnit::createFoot(status), status), 849 buffer, 850 pos, 851 status); 852 if (!assertSuccess("Error formatting", status)) { 853 return; 854 } 855 assertEquals( 856 "TestFormatSingleArg", 857 UnicodeString("3.5 feet"), 858 buffer); 859 } 860 861 void MeasureFormatTest::TestFormatMeasuresZeroArg() { 862 UErrorCode status = U_ZERO_ERROR; 863 MeasureFormat fmt("en", UMEASFMT_WIDTH_WIDE, status); 864 verifyFormat("TestFormatMeasuresZeroArg", fmt, NULL, 0, ""); 865 } 866 867 void MeasureFormatTest::TestSimplePer() { 868 Locale en("en"); 869 UErrorCode status = U_ZERO_ERROR; 870 LocalPointer<MeasureUnit> second(MeasureUnit::createSecond(status)); 871 LocalPointer<MeasureUnit> minute(MeasureUnit::createMinute(status)); 872 LocalPointer<MeasureUnit> pound(MeasureUnit::createPound(status)); 873 if (!assertSuccess("", status)) { 874 return; 875 } 876 877 helperTestSimplePer( 878 en, UMEASFMT_WIDTH_WIDE, 879 1.0, *pound, *second, "1 pound per second"); 880 helperTestSimplePer( 881 en, UMEASFMT_WIDTH_WIDE, 882 2.0, *pound, *second, "2 pounds per second"); 883 helperTestSimplePer( 884 en, UMEASFMT_WIDTH_WIDE, 885 1.0, *pound, *minute, "1 pound per minute"); 886 helperTestSimplePer( 887 en, UMEASFMT_WIDTH_WIDE, 888 2.0, *pound, *minute, "2 pounds per minute"); 889 890 helperTestSimplePer( 891 en, UMEASFMT_WIDTH_SHORT, 1.0, *pound, *second, "1 lbps"); 892 helperTestSimplePer( 893 en, UMEASFMT_WIDTH_SHORT, 2.0, *pound, *second, "2 lbps"); 894 helperTestSimplePer( 895 en, UMEASFMT_WIDTH_SHORT, 1.0, *pound, *minute, "1 lb/min"); 896 helperTestSimplePer( 897 en, UMEASFMT_WIDTH_SHORT, 2.0, *pound, *minute, "2 lb/min"); 898 899 helperTestSimplePer( 900 en, UMEASFMT_WIDTH_NARROW, 1.0, *pound, *second, "1#/s"); 901 helperTestSimplePer( 902 en, UMEASFMT_WIDTH_NARROW, 2.0, *pound, *second, "2#/s"); 903 helperTestSimplePer( 904 en, UMEASFMT_WIDTH_NARROW, 1.0, *pound, *minute, "1#/m"); 905 helperTestSimplePer( 906 en, UMEASFMT_WIDTH_NARROW, 2.0, *pound, *minute, "2#/m"); 907 908 helperTestSimplePer( 909 en, UMEASFMT_WIDTH_SHORT, 910 23.3, *pound, *second, "23.3 lbps", 911 NumberFormat::kDecimalSeparatorField, 912 2, 3); 913 914 helperTestSimplePer( 915 en, UMEASFMT_WIDTH_SHORT, 916 23.3, *pound, *second, "23.3 lbps", 917 NumberFormat::kIntegerField, 918 0, 2); 919 920 helperTestSimplePer( 921 en, UMEASFMT_WIDTH_SHORT, 922 23.3, *pound, *minute, "23.3 lb/min", 923 NumberFormat::kDecimalSeparatorField, 924 2, 3); 925 926 helperTestSimplePer( 927 en, UMEASFMT_WIDTH_SHORT, 928 23.3, *pound, *minute, "23.3 lb/min", 929 NumberFormat::kIntegerField, 930 0, 2); 931 } 932 933 void MeasureFormatTest::TestNumeratorPlurals() { 934 Locale pl("pl"); 935 UErrorCode status = U_ZERO_ERROR; 936 LocalPointer<MeasureUnit> second(MeasureUnit::createSecond(status)); 937 LocalPointer<MeasureUnit> foot(MeasureUnit::createFoot(status)); 938 if (!assertSuccess("", status)) { 939 return; 940 } 941 942 helperTestSimplePer( 943 pl, 944 UMEASFMT_WIDTH_WIDE, 945 1.0, *foot, *second, "1 stopa na sekund\\u0119"); 946 helperTestSimplePer( 947 pl, 948 UMEASFMT_WIDTH_WIDE, 949 2.0, *foot, *second, "2 stopy na sekund\\u0119"); 950 helperTestSimplePer( 951 pl, 952 UMEASFMT_WIDTH_WIDE, 953 5.0, *foot, *second, "5 st\\u00f3p na sekund\\u0119"); 954 helperTestSimplePer( 955 pl, UMEASFMT_WIDTH_WIDE, 956 1.5, *foot, *second, "1,5 stopy na sekund\\u0119"); 957 } 958 959 void MeasureFormatTest::helperTestSimplePer( 960 const Locale &locale, 961 UMeasureFormatWidth width, 962 double value, 963 const MeasureUnit &unit, 964 const MeasureUnit &perUnit, 965 const char *expected) { 966 helperTestSimplePer( 967 locale, 968 width, 969 value, 970 unit, 971 perUnit, 972 expected, 973 FieldPosition::DONT_CARE, 974 0, 975 0); 976 } 977 978 void MeasureFormatTest::helperTestSimplePer( 979 const Locale &locale, 980 UMeasureFormatWidth width, 981 double value, 982 const MeasureUnit &unit, 983 const MeasureUnit &perUnit, 984 const char *expected, 985 int32_t field, 986 int32_t expected_start, 987 int32_t expected_end) { 988 UErrorCode status = U_ZERO_ERROR; 989 FieldPosition pos(field); 990 MeasureFormat fmt(locale, width, status); 991 if (!assertSuccess("Error creating format object", status)) { 992 return; 993 } 994 Measure measure(value, (MeasureUnit *) unit.clone(), status); 995 if (!assertSuccess("Error creating measure object", status)) { 996 return; 997 } 998 UnicodeString prefix("prefix: "); 999 UnicodeString buffer(prefix); 1000 fmt.formatMeasurePerUnit( 1001 measure, 1002 perUnit, 1003 buffer, 1004 pos, 1005 status); 1006 if (!assertSuccess("Error formatting measures with per", status)) { 1007 return; 1008 } 1009 UnicodeString uexpected(expected); 1010 uexpected = prefix + uexpected; 1011 assertEquals( 1012 "TestSimplePer", 1013 uexpected.unescape(), 1014 buffer); 1015 if (field != FieldPosition::DONT_CARE) { 1016 assertEquals( 1017 "Start", expected_start, pos.getBeginIndex() - prefix.length()); 1018 assertEquals( 1019 "End", expected_end, pos.getEndIndex() - prefix.length()); 1020 } 1021 } 1022 1023 void MeasureFormatTest::TestMultiples() { 1024 Locale ru("ru"); 1025 Locale en("en"); 1026 helperTestMultiples(en, UMEASFMT_WIDTH_WIDE, "2 miles, 1 foot, 2.3 inches"); 1027 helperTestMultiples(en, UMEASFMT_WIDTH_SHORT, "2 mi, 1 ft, 2.3 in"); 1028 helperTestMultiples(en, UMEASFMT_WIDTH_NARROW, "2mi 1\\u2032 2.3\\u2033"); 1029 helperTestMultiples(ru, UMEASFMT_WIDTH_WIDE, "2 \\u043C\\u0438\\u043B\\u0438, 1 \\u0444\\u0443\\u0442 \\u0438 2,3 \\u0434\\u044E\\u0439\\u043C\\u0430"); 1030 helperTestMultiples(ru, UMEASFMT_WIDTH_SHORT, "2 \\u043C\\u0438\\u043B\\u0438, 1 \\u0444\\u0443\\u0442, 2,3 \\u0434\\u044E\\u0439\\u043C."); 1031 helperTestMultiples(ru, UMEASFMT_WIDTH_NARROW, "2 \\u043C\\u0438\\u043B\\u044C 1 \\u0444\\u0443\\u0442 2,3 \\u0434\\u044E\\u0439\\u043C\\u0430"); 1032 } 1033 1034 void MeasureFormatTest::helperTestMultiples( 1035 const Locale &locale, 1036 UMeasureFormatWidth width, 1037 const char *expected) { 1038 UErrorCode status = U_ZERO_ERROR; 1039 FieldPosition pos(0); 1040 MeasureFormat fmt(locale, width, status); 1041 if (!assertSuccess("Error creating format object", status)) { 1042 return; 1043 } 1044 Measure measures[] = { 1045 Measure(2, MeasureUnit::createMile(status), status), 1046 Measure(1, MeasureUnit::createFoot(status), status), 1047 Measure(2.3, MeasureUnit::createInch(status), status)}; 1048 if (!assertSuccess("Error creating measures", status)) { 1049 return; 1050 } 1051 UnicodeString buffer; 1052 fmt.formatMeasures(measures, UPRV_LENGTHOF(measures), buffer, pos, status); 1053 if (!assertSuccess("Error formatting measures", status)) { 1054 return; 1055 } 1056 assertEquals("TestMultiples", UnicodeString(expected).unescape(), buffer); 1057 } 1058 1059 void MeasureFormatTest::TestGram() { 1060 UErrorCode status = U_ZERO_ERROR; 1061 MeasureFormat fmt("en", UMEASFMT_WIDTH_SHORT, status); 1062 if (!assertSuccess("Error creating format object", status)) { 1063 return; 1064 } 1065 Measure gram(1, MeasureUnit::createGram(status), status); 1066 Measure gforce(1, MeasureUnit::createGForce(status), status); 1067 if (!assertSuccess("Error creating measures", status)) { 1068 return; 1069 } 1070 verifyFormat("TestGram", fmt, &gram, 1, "1 g"); 1071 verifyFormat("TestGram", fmt, &gforce, 1, "1 G"); 1072 } 1073 1074 void MeasureFormatTest::TestCurrencies() { 1075 UChar USD[] = {'U', 'S', 'D', 0}; 1076 UErrorCode status = U_ZERO_ERROR; 1077 CurrencyAmount USD_1(1.0, USD, status); 1078 CurrencyAmount USD_2(2.0, USD, status); 1079 CurrencyAmount USD_NEG_1(-1.0, USD, status); 1080 if (!assertSuccess("Error creating measures", status)) { 1081 return; 1082 } 1083 Locale en("en"); 1084 MeasureFormat fmt(en, UMEASFMT_WIDTH_WIDE, status); 1085 if (!assertSuccess("Error creating format object", status)) { 1086 return; 1087 } 1088 verifyFormat("TestCurrenciesWide", fmt, &USD_NEG_1, 1, "-1.00 US dollars"); 1089 verifyFormat("TestCurrenciesWide", fmt, &USD_1, 1, "1.00 US dollars"); 1090 verifyFormat("TestCurrenciesWide", fmt, &USD_2, 1, "2.00 US dollars"); 1091 fmt = MeasureFormat(en, UMEASFMT_WIDTH_SHORT, status); 1092 if (!assertSuccess("Error creating format object", status)) { 1093 return; 1094 } 1095 verifyFormat("TestCurrenciesShort", fmt, &USD_NEG_1, 1, "-USD1.00"); 1096 verifyFormat("TestCurrenciesShort", fmt, &USD_1, 1, "USD1.00"); 1097 verifyFormat("TestCurrenciesShort", fmt, &USD_2, 1, "USD2.00"); 1098 fmt = MeasureFormat(en, UMEASFMT_WIDTH_NARROW, status); 1099 if (!assertSuccess("Error creating format object", status)) { 1100 return; 1101 } 1102 verifyFormat("TestCurrenciesNarrow", fmt, &USD_NEG_1, 1, "-$1.00"); 1103 verifyFormat("TestCurrenciesNarrow", fmt, &USD_1, 1, "$1.00"); 1104 verifyFormat("TestCurrenciesNarrow", fmt, &USD_2, 1, "$2.00"); 1105 fmt = MeasureFormat(en, UMEASFMT_WIDTH_NUMERIC, status); 1106 if (!assertSuccess("Error creating format object", status)) { 1107 return; 1108 } 1109 verifyFormat("TestCurrenciesNumeric", fmt, &USD_NEG_1, 1, "-$1.00"); 1110 verifyFormat("TestCurrenciesNumeric", fmt, &USD_1, 1, "$1.00"); 1111 verifyFormat("TestCurrenciesNumeric", fmt, &USD_2, 1, "$2.00"); 1112 } 1113 1114 void MeasureFormatTest::TestFieldPosition() { 1115 UErrorCode status = U_ZERO_ERROR; 1116 MeasureFormat fmt("en", UMEASFMT_WIDTH_SHORT, status); 1117 if (!assertSuccess("Error creating format object", status)) { 1118 return; 1119 } 1120 Measure measure(43.5, MeasureUnit::createFoot(status), status); 1121 if (!assertSuccess("Error creating measure object 1", status)) { 1122 return; 1123 } 1124 UnicodeString prefix("123456: "); 1125 verifyFieldPosition( 1126 "", 1127 fmt, 1128 prefix, 1129 &measure, 1130 1, 1131 NumberFormat::kDecimalSeparatorField, 1132 10, 1133 11); 1134 measure = Measure(43, MeasureUnit::createFoot(status), status); 1135 if (!assertSuccess("Error creating measure object 2", status)) { 1136 return; 1137 } 1138 verifyFieldPosition( 1139 "", 1140 fmt, 1141 prefix, 1142 &measure, 1143 1, 1144 NumberFormat::kDecimalSeparatorField, 1145 0, 1146 0); 1147 } 1148 1149 void MeasureFormatTest::TestFieldPositionMultiple() { 1150 UErrorCode status = U_ZERO_ERROR; 1151 MeasureFormat fmt("en", UMEASFMT_WIDTH_SHORT, status); 1152 if (!assertSuccess("Error creating format object", status)) { 1153 return; 1154 } 1155 Measure first[] = { 1156 Measure(354, MeasureUnit::createMeter(status), status), 1157 Measure(23, MeasureUnit::createCentimeter(status), status)}; 1158 Measure second[] = { 1159 Measure(354, MeasureUnit::createMeter(status), status), 1160 Measure(23, MeasureUnit::createCentimeter(status), status), 1161 Measure(5.4, MeasureUnit::createMillimeter(status), status)}; 1162 Measure third[] = { 1163 Measure(3, MeasureUnit::createMeter(status), status), 1164 Measure(23, MeasureUnit::createCentimeter(status), status), 1165 Measure(5, MeasureUnit::createMillimeter(status), status)}; 1166 if (!assertSuccess("Error creating measure objects", status)) { 1167 return; 1168 } 1169 UnicodeString prefix("123456: "); 1170 verifyFieldPosition( 1171 "Integer", 1172 fmt, 1173 prefix, 1174 first, 1175 UPRV_LENGTHOF(first), 1176 NumberFormat::kIntegerField, 1177 8, 1178 11); 1179 verifyFieldPosition( 1180 "Decimal separator", 1181 fmt, 1182 prefix, 1183 second, 1184 UPRV_LENGTHOF(second), 1185 NumberFormat::kDecimalSeparatorField, 1186 23, 1187 24); 1188 verifyFieldPosition( 1189 "no decimal separator", 1190 fmt, 1191 prefix, 1192 third, 1193 UPRV_LENGTHOF(third), 1194 NumberFormat::kDecimalSeparatorField, 1195 0, 1196 0); 1197 } 1198 1199 void MeasureFormatTest::TestBadArg() { 1200 UErrorCode status = U_ZERO_ERROR; 1201 MeasureFormat fmt("en", UMEASFMT_WIDTH_SHORT, status); 1202 if (!assertSuccess("Error creating format object", status)) { 1203 return; 1204 } 1205 FieldPosition pos(0); 1206 UnicodeString buffer; 1207 fmt.format( 1208 9.3, 1209 buffer, 1210 pos, 1211 status); 1212 if (status != U_ILLEGAL_ARGUMENT_ERROR) { 1213 errln("Expected ILLEGAL_ARGUMENT_ERROR"); 1214 } 1215 } 1216 1217 void MeasureFormatTest::TestEquality() { 1218 UErrorCode status = U_ZERO_ERROR; 1219 NumberFormat* nfeq = NumberFormat::createInstance("en", status); 1220 NumberFormat* nfne = NumberFormat::createInstance("fr", status); 1221 MeasureFormat fmt("en", UMEASFMT_WIDTH_SHORT, status); 1222 MeasureFormat fmtEq2("en", UMEASFMT_WIDTH_SHORT, nfeq, status); 1223 MeasureFormat fmtne1("en", UMEASFMT_WIDTH_WIDE, status); 1224 MeasureFormat fmtne2("fr", UMEASFMT_WIDTH_SHORT, status); 1225 MeasureFormat fmtne3("en", UMEASFMT_WIDTH_SHORT, nfne, status); 1226 if (U_FAILURE(status)) { 1227 dataerrln("Error creating MeasureFormats - %s", u_errorName(status)); 1228 return; 1229 } 1230 MeasureFormat fmtEq(fmt); 1231 assertTrue("Equal", fmt == fmtEq); 1232 assertTrue("Equal2", fmt == fmtEq2); 1233 assertFalse("Equal Neg", fmt != fmtEq); 1234 assertTrue("Not Equal 1", fmt != fmtne1); 1235 assertFalse("Not Equal Neg 1", fmt == fmtne1); 1236 assertTrue("Not Equal 2", fmt != fmtne2); 1237 assertTrue("Not Equal 3", fmt != fmtne3); 1238 } 1239 1240 void MeasureFormatTest::TestGroupingSeparator() { 1241 UErrorCode status = U_ZERO_ERROR; 1242 Locale en("en"); 1243 MeasureFormat fmt(en, UMEASFMT_WIDTH_SHORT, status); 1244 if (!assertSuccess("Error creating format object", status)) { 1245 return; 1246 } 1247 Measure ms[] = { 1248 Measure((int32_t)INT32_MAX, MeasureUnit::createYear(status), status), 1249 Measure((int32_t)INT32_MIN, MeasureUnit::createMonth(status), status), 1250 Measure(-987, MeasureUnit::createDay(status), status), 1251 Measure(1362, MeasureUnit::createHour(status), status), 1252 Measure(987, MeasureUnit::createMinute(status), status)}; 1253 FieldPosition pos(NumberFormat::kGroupingSeparatorField); 1254 UnicodeString appendTo; 1255 fmt.formatMeasures(ms, 5, appendTo, pos, status); 1256 if (!assertSuccess("Error formatting", status)) { 1257 return; 1258 } 1259 assertEquals( 1260 "grouping separator", 1261 "2,147,483,647 yrs, -2,147,483,648 mths, -987 days, 1,362 hr, 987 min", 1262 appendTo); 1263 assertEquals("begin index", 9, pos.getBeginIndex()); 1264 assertEquals("end index", 10, pos.getEndIndex()); 1265 } 1266 1267 void MeasureFormatTest::TestDoubleZero() { 1268 UErrorCode status = U_ZERO_ERROR; 1269 Measure measures[] = { 1270 Measure(4.7, MeasureUnit::createHour(status), status), 1271 Measure(23, MeasureUnit::createMinute(status), status), 1272 Measure(16, MeasureUnit::createSecond(status), status)}; 1273 Locale en("en"); 1274 NumberFormat *nf = NumberFormat::createInstance(en, status); 1275 MeasureFormat fmt("en", UMEASFMT_WIDTH_WIDE, nf, status); 1276 UnicodeString appendTo; 1277 FieldPosition pos(FieldPosition::DONT_CARE); 1278 if (U_FAILURE(status)) { 1279 dataerrln("Error creating formatter - %s", u_errorName(status)); 1280 return; 1281 } 1282 nf->setMinimumFractionDigits(2); 1283 nf->setMaximumFractionDigits(2); 1284 fmt.formatMeasures(measures, UPRV_LENGTHOF(measures), appendTo, pos, status); 1285 if (!assertSuccess("Error formatting", status)) { 1286 return; 1287 } 1288 assertEquals( 1289 "TestDoubleZero", 1290 UnicodeString("4 hours, 23 minutes, 16.00 seconds"), 1291 appendTo); 1292 measures[0] = Measure(-4.7, MeasureUnit::createHour(status), status); 1293 appendTo.remove(); 1294 fmt.formatMeasures(measures, UPRV_LENGTHOF(measures), appendTo, pos, status); 1295 if (!assertSuccess("Error formatting", status)) { 1296 return; 1297 } 1298 assertEquals( 1299 "TestDoubleZero", 1300 UnicodeString("-4 hours, 23 minutes, 16.00 seconds"), 1301 appendTo); 1302 } 1303 1304 void MeasureFormatTest::TestUnitPerUnitResolution() { 1305 UErrorCode status = U_ZERO_ERROR; 1306 Locale en("en"); 1307 MeasureFormat fmt("en", UMEASFMT_WIDTH_SHORT, status); 1308 Measure measure(50, MeasureUnit::createPound(status), status); 1309 LocalPointer<MeasureUnit> sqInch(MeasureUnit::createSquareInch(status)); 1310 if (!assertSuccess("Create of format unit and per unit", status)) { 1311 return; 1312 } 1313 FieldPosition pos(0); 1314 UnicodeString actual; 1315 fmt.formatMeasurePerUnit( 1316 measure, 1317 *sqInch, 1318 actual, 1319 pos, 1320 status); 1321 assertEquals("", "50 psi", actual); 1322 } 1323 1324 void MeasureFormatTest::verifyFieldPosition( 1325 const char *description, 1326 const MeasureFormat &fmt, 1327 const UnicodeString &prefix, 1328 const Measure *measures, 1329 int32_t measureCount, 1330 NumberFormat::EAlignmentFields field, 1331 int32_t start, 1332 int32_t end) { 1333 // 8 char lead 1334 UnicodeString result(prefix); 1335 FieldPosition pos(field); 1336 UErrorCode status = U_ZERO_ERROR; 1337 CharString ch; 1338 const char *descPrefix = ch.append(description, status) 1339 .append(": ", status).data(); 1340 CharString beginIndex; 1341 beginIndex.append(descPrefix, status).append("beginIndex", status); 1342 CharString endIndex; 1343 endIndex.append(descPrefix, status).append("endIndex", status); 1344 fmt.formatMeasures(measures, measureCount, result, pos, status); 1345 if (!assertSuccess("Error formatting", status)) { 1346 return; 1347 } 1348 assertEquals(beginIndex.data(), start, pos.getBeginIndex()); 1349 assertEquals(endIndex.data(), end, pos.getEndIndex()); 1350 } 1351 1352 void MeasureFormatTest::verifyFormat( 1353 const char *description, 1354 const MeasureFormat &fmt, 1355 const Measure *measures, 1356 int32_t measureCount, 1357 const char *expected) { 1358 verifyFormatWithPrefix( 1359 description, 1360 fmt, 1361 "", 1362 measures, 1363 measureCount, 1364 expected); 1365 } 1366 1367 void MeasureFormatTest::verifyFormatWithPrefix( 1368 const char *description, 1369 const MeasureFormat &fmt, 1370 const UnicodeString &prefix, 1371 const Measure *measures, 1372 int32_t measureCount, 1373 const char *expected) { 1374 UnicodeString result(prefix); 1375 FieldPosition pos(0); 1376 UErrorCode status = U_ZERO_ERROR; 1377 fmt.formatMeasures(measures, measureCount, result, pos, status); 1378 if (!assertSuccess("Error formatting", status)) { 1379 return; 1380 } 1381 assertEquals(description, UnicodeString(expected).unescape(), result); 1382 } 1383 1384 void MeasureFormatTest::verifyFormat( 1385 const char *description, 1386 const MeasureFormat &fmt, 1387 const ExpectedResult *expectedResults, 1388 int32_t count) { 1389 for (int32_t i = 0; i < count; ++i) { 1390 verifyFormat(description, fmt, expectedResults[i].measures, expectedResults[i].count, expectedResults[i].expected); 1391 } 1392 } 1393 1394 extern IntlTest *createMeasureFormatTest() { 1395 return new MeasureFormatTest(); 1396 } 1397 1398 #endif 1399 1400