Home | History | Annotate | Download | only in intltest
      1 // Copyright (C) 2016 and later: Unicode, Inc. and others.
      2 // License & terms of use: http://www.unicode.org/copyright.html
      3 /*
      4 *******************************************************************************
      5 * Copyright (C) 2014-2016, International Business Machines Corporation and    *
      6 * others. All Rights Reserved.                                                *
      7 *******************************************************************************
      8 *
      9 * File MEASFMTTEST.CPP
     10 *
     11 *******************************************************************************
     12 */
     13 #include <stdio.h>
     14 #include <stdlib.h>
     15 
     16 #include "intltest.h"
     17 
     18 #if !UCONFIG_NO_FORMATTING
     19 
     20 #include "unicode/decimfmt.h"
     21 #include "unicode/measfmt.h"
     22 #include "unicode/measure.h"
     23 #include "unicode/measunit.h"
     24 #include "unicode/tmunit.h"
     25 #include "unicode/plurrule.h"
     26 #include "charstr.h"
     27 #include "cstr.h"
     28 #include "unicode/reldatefmt.h"
     29 
     30 struct ExpectedResult {
     31     const Measure *measures;
     32     int32_t count;
     33     const char *expected;
     34 };
     35 
     36 class MeasureFormatTest : public IntlTest {
     37 public:
     38     MeasureFormatTest() {
     39     }
     40 
     41     void runIndexedTest(int32_t index, UBool exec, const char *&name, char *par=0);
     42 private:
     43     void TestBasic();
     44     void TestCompatible53_1();
     45     void TestCompatible54_1();
     46     void TestCompatible55_1();
     47     void TestCompatible56_1();
     48     void TestCompatible57_1();
     49     void TestCompatible58_1();
     50     void TestGetAvailable();
     51     void TestExamplesInDocs();
     52     void TestFormatPeriodEn();
     53     void Test10219FractionalPlurals();
     54     void TestGreek();
     55     void TestFormatSingleArg();
     56     void TestFormatMeasuresZeroArg();
     57     void TestSimplePer();
     58     void TestNumeratorPlurals();
     59     void TestMultiples();
     60     void TestManyLocaleDurations();
     61     void TestGram();
     62     void TestCurrencies();
     63     void TestDisplayNames();
     64     void TestFieldPosition();
     65     void TestFieldPositionMultiple();
     66     void TestBadArg();
     67     void TestEquality();
     68     void TestGroupingSeparator();
     69     void TestDoubleZero();
     70     void TestUnitPerUnitResolution();
     71     void TestIndividualPluralFallback();
     72     void verifyFormat(
     73         const char *description,
     74         const MeasureFormat &fmt,
     75         const Measure *measures,
     76         int32_t measureCount,
     77         const char *expected);
     78     void verifyFormatWithPrefix(
     79         const char *description,
     80         const MeasureFormat &fmt,
     81         const UnicodeString &prefix,
     82         const Measure *measures,
     83         int32_t measureCount,
     84         const char *expected);
     85     void verifyFormat(
     86         const char *description,
     87         const MeasureFormat &fmt,
     88         const ExpectedResult *expectedResults,
     89         int32_t count);
     90     void helperTestSimplePer(
     91         const Locale &locale,
     92         UMeasureFormatWidth width,
     93         double value,
     94         const MeasureUnit &unit,
     95         const MeasureUnit &perUnit,
     96         const char *expected);
     97     void helperTestSimplePer(
     98         const Locale &locale,
     99         UMeasureFormatWidth width,
    100         double value,
    101         const MeasureUnit &unit,
    102         const MeasureUnit &perUnit,
    103         const char *expected,
    104         int32_t field,
    105         int32_t expected_start,
    106         int32_t expected_end);
    107     void helperTestMultiples(
    108         const Locale &locale,
    109         UMeasureFormatWidth width,
    110         const char *expected);
    111     void helperTestManyLocaleDurations(
    112         const char *localeID,
    113         UMeasureFormatWidth width,
    114         const Measure *measures,
    115         int32_t measureCount,
    116         const char *expected);
    117     void helperTestDisplayName(
    118         const MeasureUnit *unit,
    119         const char *localeID,
    120         UMeasureFormatWidth width,
    121         const char *expected);
    122     void verifyFieldPosition(
    123         const char *description,
    124         const MeasureFormat &fmt,
    125         const UnicodeString &prefix,
    126         const Measure *measures,
    127         int32_t measureCount,
    128         NumberFormat::EAlignmentFields field,
    129         int32_t start,
    130         int32_t end);
    131 };
    132 
    133 void MeasureFormatTest::runIndexedTest(
    134         int32_t index, UBool exec, const char *&name, char *) {
    135     if (exec) {
    136         logln("TestSuite MeasureFormatTest: ");
    137     }
    138     TESTCASE_AUTO_BEGIN;
    139     TESTCASE_AUTO(TestBasic);
    140     TESTCASE_AUTO(TestCompatible53_1);
    141     TESTCASE_AUTO(TestCompatible54_1);
    142     TESTCASE_AUTO(TestCompatible55_1);
    143     TESTCASE_AUTO(TestCompatible56_1);
    144     TESTCASE_AUTO(TestCompatible57_1);
    145     TESTCASE_AUTO(TestCompatible58_1);
    146     TESTCASE_AUTO(TestGetAvailable);
    147     TESTCASE_AUTO(TestExamplesInDocs);
    148     TESTCASE_AUTO(TestFormatPeriodEn);
    149     TESTCASE_AUTO(Test10219FractionalPlurals);
    150     TESTCASE_AUTO(TestGreek);
    151     TESTCASE_AUTO(TestFormatSingleArg);
    152     TESTCASE_AUTO(TestFormatMeasuresZeroArg);
    153     TESTCASE_AUTO(TestSimplePer);
    154     TESTCASE_AUTO(TestNumeratorPlurals);
    155     TESTCASE_AUTO(TestMultiples);
    156     TESTCASE_AUTO(TestManyLocaleDurations);
    157     TESTCASE_AUTO(TestGram);
    158     TESTCASE_AUTO(TestCurrencies);
    159     TESTCASE_AUTO(TestDisplayNames);
    160     TESTCASE_AUTO(TestFieldPosition);
    161     TESTCASE_AUTO(TestFieldPositionMultiple);
    162     TESTCASE_AUTO(TestBadArg);
    163     TESTCASE_AUTO(TestEquality);
    164     TESTCASE_AUTO(TestGroupingSeparator);
    165     TESTCASE_AUTO(TestDoubleZero);
    166     TESTCASE_AUTO(TestUnitPerUnitResolution);
    167     TESTCASE_AUTO(TestIndividualPluralFallback);
    168     TESTCASE_AUTO_END;
    169 }
    170 
    171 void MeasureFormatTest::TestCompatible53_1() {
    172     UErrorCode status = U_ZERO_ERROR;
    173     LocalPointer<MeasureUnit> measureUnit;
    174     measureUnit.adoptInstead(MeasureUnit::createGForce(status));
    175     measureUnit.adoptInstead(MeasureUnit::createArcMinute(status));
    176     measureUnit.adoptInstead(MeasureUnit::createArcSecond(status));
    177     measureUnit.adoptInstead(MeasureUnit::createDegree(status));
    178     measureUnit.adoptInstead(MeasureUnit::createAcre(status));
    179     measureUnit.adoptInstead(MeasureUnit::createHectare(status));
    180     measureUnit.adoptInstead(MeasureUnit::createSquareFoot(status));
    181     measureUnit.adoptInstead(MeasureUnit::createSquareKilometer(status));
    182     measureUnit.adoptInstead(MeasureUnit::createSquareMeter(status));
    183     measureUnit.adoptInstead(MeasureUnit::createSquareMile(status));
    184     measureUnit.adoptInstead(MeasureUnit::createDay(status));
    185     measureUnit.adoptInstead(MeasureUnit::createHour(status));
    186     measureUnit.adoptInstead(MeasureUnit::createMillisecond(status));
    187     measureUnit.adoptInstead(MeasureUnit::createMinute(status));
    188     measureUnit.adoptInstead(MeasureUnit::createMonth(status));
    189     measureUnit.adoptInstead(MeasureUnit::createSecond(status));
    190     measureUnit.adoptInstead(MeasureUnit::createWeek(status));
    191     measureUnit.adoptInstead(MeasureUnit::createYear(status));
    192     measureUnit.adoptInstead(MeasureUnit::createCentimeter(status));
    193     measureUnit.adoptInstead(MeasureUnit::createFoot(status));
    194     measureUnit.adoptInstead(MeasureUnit::createInch(status));
    195     measureUnit.adoptInstead(MeasureUnit::createKilometer(status));
    196     measureUnit.adoptInstead(MeasureUnit::createLightYear(status));
    197     measureUnit.adoptInstead(MeasureUnit::createMeter(status));
    198     measureUnit.adoptInstead(MeasureUnit::createMile(status));
    199     measureUnit.adoptInstead(MeasureUnit::createMillimeter(status));
    200     measureUnit.adoptInstead(MeasureUnit::createPicometer(status));
    201     measureUnit.adoptInstead(MeasureUnit::createYard(status));
    202     measureUnit.adoptInstead(MeasureUnit::createGram(status));
    203     measureUnit.adoptInstead(MeasureUnit::createKilogram(status));
    204     measureUnit.adoptInstead(MeasureUnit::createOunce(status));
    205     measureUnit.adoptInstead(MeasureUnit::createPound(status));
    206     measureUnit.adoptInstead(MeasureUnit::createHorsepower(status));
    207     measureUnit.adoptInstead(MeasureUnit::createKilowatt(status));
    208     measureUnit.adoptInstead(MeasureUnit::createWatt(status));
    209     measureUnit.adoptInstead(MeasureUnit::createHectopascal(status));
    210     measureUnit.adoptInstead(MeasureUnit::createInchHg(status));
    211     measureUnit.adoptInstead(MeasureUnit::createMillibar(status));
    212     measureUnit.adoptInstead(MeasureUnit::createKilometerPerHour(status));
    213     measureUnit.adoptInstead(MeasureUnit::createMeterPerSecond(status));
    214     measureUnit.adoptInstead(MeasureUnit::createMilePerHour(status));
    215     measureUnit.adoptInstead(MeasureUnit::createCelsius(status));
    216     measureUnit.adoptInstead(MeasureUnit::createFahrenheit(status));
    217     measureUnit.adoptInstead(MeasureUnit::createCubicKilometer(status));
    218     measureUnit.adoptInstead(MeasureUnit::createCubicMile(status));
    219     measureUnit.adoptInstead(MeasureUnit::createLiter(status));
    220     assertSuccess("", status);
    221 }
    222 
    223 void MeasureFormatTest::TestCompatible54_1() {
    224     UErrorCode status = U_ZERO_ERROR;
    225     LocalPointer<MeasureUnit> measureUnit;
    226     measureUnit.adoptInstead(MeasureUnit::createGForce(status));
    227     measureUnit.adoptInstead(MeasureUnit::createMeterPerSecondSquared(status));
    228     measureUnit.adoptInstead(MeasureUnit::createArcMinute(status));
    229     measureUnit.adoptInstead(MeasureUnit::createArcSecond(status));
    230     measureUnit.adoptInstead(MeasureUnit::createDegree(status));
    231     measureUnit.adoptInstead(MeasureUnit::createRadian(status));
    232     measureUnit.adoptInstead(MeasureUnit::createAcre(status));
    233     measureUnit.adoptInstead(MeasureUnit::createHectare(status));
    234     measureUnit.adoptInstead(MeasureUnit::createSquareCentimeter(status));
    235     measureUnit.adoptInstead(MeasureUnit::createSquareFoot(status));
    236     measureUnit.adoptInstead(MeasureUnit::createSquareInch(status));
    237     measureUnit.adoptInstead(MeasureUnit::createSquareKilometer(status));
    238     measureUnit.adoptInstead(MeasureUnit::createSquareMeter(status));
    239     measureUnit.adoptInstead(MeasureUnit::createSquareMile(status));
    240     measureUnit.adoptInstead(MeasureUnit::createSquareYard(status));
    241     measureUnit.adoptInstead(MeasureUnit::createLiterPerKilometer(status));
    242     measureUnit.adoptInstead(MeasureUnit::createMilePerGallon(status));
    243     measureUnit.adoptInstead(MeasureUnit::createBit(status));
    244     measureUnit.adoptInstead(MeasureUnit::createByte(status));
    245     measureUnit.adoptInstead(MeasureUnit::createGigabit(status));
    246     measureUnit.adoptInstead(MeasureUnit::createGigabyte(status));
    247     measureUnit.adoptInstead(MeasureUnit::createKilobit(status));
    248     measureUnit.adoptInstead(MeasureUnit::createKilobyte(status));
    249     measureUnit.adoptInstead(MeasureUnit::createMegabit(status));
    250     measureUnit.adoptInstead(MeasureUnit::createMegabyte(status));
    251     measureUnit.adoptInstead(MeasureUnit::createTerabit(status));
    252     measureUnit.adoptInstead(MeasureUnit::createTerabyte(status));
    253     measureUnit.adoptInstead(MeasureUnit::createDay(status));
    254     measureUnit.adoptInstead(MeasureUnit::createHour(status));
    255     measureUnit.adoptInstead(MeasureUnit::createMicrosecond(status));
    256     measureUnit.adoptInstead(MeasureUnit::createMillisecond(status));
    257     measureUnit.adoptInstead(MeasureUnit::createMinute(status));
    258     measureUnit.adoptInstead(MeasureUnit::createMonth(status));
    259     measureUnit.adoptInstead(MeasureUnit::createNanosecond(status));
    260     measureUnit.adoptInstead(MeasureUnit::createSecond(status));
    261     measureUnit.adoptInstead(MeasureUnit::createWeek(status));
    262     measureUnit.adoptInstead(MeasureUnit::createYear(status));
    263     measureUnit.adoptInstead(MeasureUnit::createAmpere(status));
    264     measureUnit.adoptInstead(MeasureUnit::createMilliampere(status));
    265     measureUnit.adoptInstead(MeasureUnit::createOhm(status));
    266     measureUnit.adoptInstead(MeasureUnit::createVolt(status));
    267     measureUnit.adoptInstead(MeasureUnit::createCalorie(status));
    268     measureUnit.adoptInstead(MeasureUnit::createFoodcalorie(status));
    269     measureUnit.adoptInstead(MeasureUnit::createJoule(status));
    270     measureUnit.adoptInstead(MeasureUnit::createKilocalorie(status));
    271     measureUnit.adoptInstead(MeasureUnit::createKilojoule(status));
    272     measureUnit.adoptInstead(MeasureUnit::createKilowattHour(status));
    273     measureUnit.adoptInstead(MeasureUnit::createGigahertz(status));
    274     measureUnit.adoptInstead(MeasureUnit::createHertz(status));
    275     measureUnit.adoptInstead(MeasureUnit::createKilohertz(status));
    276     measureUnit.adoptInstead(MeasureUnit::createMegahertz(status));
    277     measureUnit.adoptInstead(MeasureUnit::createAstronomicalUnit(status));
    278     measureUnit.adoptInstead(MeasureUnit::createCentimeter(status));
    279     measureUnit.adoptInstead(MeasureUnit::createDecimeter(status));
    280     measureUnit.adoptInstead(MeasureUnit::createFathom(status));
    281     measureUnit.adoptInstead(MeasureUnit::createFoot(status));
    282     measureUnit.adoptInstead(MeasureUnit::createFurlong(status));
    283     measureUnit.adoptInstead(MeasureUnit::createInch(status));
    284     measureUnit.adoptInstead(MeasureUnit::createKilometer(status));
    285     measureUnit.adoptInstead(MeasureUnit::createLightYear(status));
    286     measureUnit.adoptInstead(MeasureUnit::createMeter(status));
    287     measureUnit.adoptInstead(MeasureUnit::createMicrometer(status));
    288     measureUnit.adoptInstead(MeasureUnit::createMile(status));
    289     measureUnit.adoptInstead(MeasureUnit::createMillimeter(status));
    290     measureUnit.adoptInstead(MeasureUnit::createNanometer(status));
    291     measureUnit.adoptInstead(MeasureUnit::createNauticalMile(status));
    292     measureUnit.adoptInstead(MeasureUnit::createParsec(status));
    293     measureUnit.adoptInstead(MeasureUnit::createPicometer(status));
    294     measureUnit.adoptInstead(MeasureUnit::createYard(status));
    295     measureUnit.adoptInstead(MeasureUnit::createLux(status));
    296     measureUnit.adoptInstead(MeasureUnit::createCarat(status));
    297     measureUnit.adoptInstead(MeasureUnit::createGram(status));
    298     measureUnit.adoptInstead(MeasureUnit::createKilogram(status));
    299     measureUnit.adoptInstead(MeasureUnit::createMetricTon(status));
    300     measureUnit.adoptInstead(MeasureUnit::createMicrogram(status));
    301     measureUnit.adoptInstead(MeasureUnit::createMilligram(status));
    302     measureUnit.adoptInstead(MeasureUnit::createOunce(status));
    303     measureUnit.adoptInstead(MeasureUnit::createOunceTroy(status));
    304     measureUnit.adoptInstead(MeasureUnit::createPound(status));
    305     measureUnit.adoptInstead(MeasureUnit::createStone(status));
    306     measureUnit.adoptInstead(MeasureUnit::createTon(status));
    307     measureUnit.adoptInstead(MeasureUnit::createGigawatt(status));
    308     measureUnit.adoptInstead(MeasureUnit::createHorsepower(status));
    309     measureUnit.adoptInstead(MeasureUnit::createKilowatt(status));
    310     measureUnit.adoptInstead(MeasureUnit::createMegawatt(status));
    311     measureUnit.adoptInstead(MeasureUnit::createMilliwatt(status));
    312     measureUnit.adoptInstead(MeasureUnit::createWatt(status));
    313     measureUnit.adoptInstead(MeasureUnit::createHectopascal(status));
    314     measureUnit.adoptInstead(MeasureUnit::createInchHg(status));
    315     measureUnit.adoptInstead(MeasureUnit::createMillibar(status));
    316     measureUnit.adoptInstead(MeasureUnit::createMillimeterOfMercury(status));
    317     measureUnit.adoptInstead(MeasureUnit::createPoundPerSquareInch(status));
    318     measureUnit.adoptInstead(MeasureUnit::createKarat(status));
    319     measureUnit.adoptInstead(MeasureUnit::createKilometerPerHour(status));
    320     measureUnit.adoptInstead(MeasureUnit::createMeterPerSecond(status));
    321     measureUnit.adoptInstead(MeasureUnit::createMilePerHour(status));
    322     measureUnit.adoptInstead(MeasureUnit::createCelsius(status));
    323     measureUnit.adoptInstead(MeasureUnit::createFahrenheit(status));
    324     measureUnit.adoptInstead(MeasureUnit::createKelvin(status));
    325     measureUnit.adoptInstead(MeasureUnit::createAcreFoot(status));
    326     measureUnit.adoptInstead(MeasureUnit::createBushel(status));
    327     measureUnit.adoptInstead(MeasureUnit::createCentiliter(status));
    328     measureUnit.adoptInstead(MeasureUnit::createCubicCentimeter(status));
    329     measureUnit.adoptInstead(MeasureUnit::createCubicFoot(status));
    330     measureUnit.adoptInstead(MeasureUnit::createCubicInch(status));
    331     measureUnit.adoptInstead(MeasureUnit::createCubicKilometer(status));
    332     measureUnit.adoptInstead(MeasureUnit::createCubicMeter(status));
    333     measureUnit.adoptInstead(MeasureUnit::createCubicMile(status));
    334     measureUnit.adoptInstead(MeasureUnit::createCubicYard(status));
    335     measureUnit.adoptInstead(MeasureUnit::createCup(status));
    336     measureUnit.adoptInstead(MeasureUnit::createDeciliter(status));
    337     measureUnit.adoptInstead(MeasureUnit::createFluidOunce(status));
    338     measureUnit.adoptInstead(MeasureUnit::createGallon(status));
    339     measureUnit.adoptInstead(MeasureUnit::createHectoliter(status));
    340     measureUnit.adoptInstead(MeasureUnit::createLiter(status));
    341     measureUnit.adoptInstead(MeasureUnit::createMegaliter(status));
    342     measureUnit.adoptInstead(MeasureUnit::createMilliliter(status));
    343     measureUnit.adoptInstead(MeasureUnit::createPint(status));
    344     measureUnit.adoptInstead(MeasureUnit::createQuart(status));
    345     measureUnit.adoptInstead(MeasureUnit::createTablespoon(status));
    346     measureUnit.adoptInstead(MeasureUnit::createTeaspoon(status));
    347     assertSuccess("", status);
    348 }
    349 
    350 void MeasureFormatTest::TestCompatible55_1() {
    351     UErrorCode status = U_ZERO_ERROR;
    352     LocalPointer<MeasureUnit> measureUnit;
    353     measureUnit.adoptInstead(MeasureUnit::createGForce(status));
    354     measureUnit.adoptInstead(MeasureUnit::createMeterPerSecondSquared(status));
    355     measureUnit.adoptInstead(MeasureUnit::createArcMinute(status));
    356     measureUnit.adoptInstead(MeasureUnit::createArcSecond(status));
    357     measureUnit.adoptInstead(MeasureUnit::createDegree(status));
    358     measureUnit.adoptInstead(MeasureUnit::createRadian(status));
    359     measureUnit.adoptInstead(MeasureUnit::createAcre(status));
    360     measureUnit.adoptInstead(MeasureUnit::createHectare(status));
    361     measureUnit.adoptInstead(MeasureUnit::createSquareCentimeter(status));
    362     measureUnit.adoptInstead(MeasureUnit::createSquareFoot(status));
    363     measureUnit.adoptInstead(MeasureUnit::createSquareInch(status));
    364     measureUnit.adoptInstead(MeasureUnit::createSquareKilometer(status));
    365     measureUnit.adoptInstead(MeasureUnit::createSquareMeter(status));
    366     measureUnit.adoptInstead(MeasureUnit::createSquareMile(status));
    367     measureUnit.adoptInstead(MeasureUnit::createSquareYard(status));
    368     measureUnit.adoptInstead(MeasureUnit::createLiterPerKilometer(status));
    369     measureUnit.adoptInstead(MeasureUnit::createMilePerGallon(status));
    370     measureUnit.adoptInstead(MeasureUnit::createBit(status));
    371     measureUnit.adoptInstead(MeasureUnit::createByte(status));
    372     measureUnit.adoptInstead(MeasureUnit::createGigabit(status));
    373     measureUnit.adoptInstead(MeasureUnit::createGigabyte(status));
    374     measureUnit.adoptInstead(MeasureUnit::createKilobit(status));
    375     measureUnit.adoptInstead(MeasureUnit::createKilobyte(status));
    376     measureUnit.adoptInstead(MeasureUnit::createMegabit(status));
    377     measureUnit.adoptInstead(MeasureUnit::createMegabyte(status));
    378     measureUnit.adoptInstead(MeasureUnit::createTerabit(status));
    379     measureUnit.adoptInstead(MeasureUnit::createTerabyte(status));
    380     measureUnit.adoptInstead(MeasureUnit::createDay(status));
    381     measureUnit.adoptInstead(MeasureUnit::createHour(status));
    382     measureUnit.adoptInstead(MeasureUnit::createMicrosecond(status));
    383     measureUnit.adoptInstead(MeasureUnit::createMillisecond(status));
    384     measureUnit.adoptInstead(MeasureUnit::createMinute(status));
    385     measureUnit.adoptInstead(MeasureUnit::createMonth(status));
    386     measureUnit.adoptInstead(MeasureUnit::createNanosecond(status));
    387     measureUnit.adoptInstead(MeasureUnit::createSecond(status));
    388     measureUnit.adoptInstead(MeasureUnit::createWeek(status));
    389     measureUnit.adoptInstead(MeasureUnit::createYear(status));
    390     measureUnit.adoptInstead(MeasureUnit::createAmpere(status));
    391     measureUnit.adoptInstead(MeasureUnit::createMilliampere(status));
    392     measureUnit.adoptInstead(MeasureUnit::createOhm(status));
    393     measureUnit.adoptInstead(MeasureUnit::createVolt(status));
    394     measureUnit.adoptInstead(MeasureUnit::createCalorie(status));
    395     measureUnit.adoptInstead(MeasureUnit::createFoodcalorie(status));
    396     measureUnit.adoptInstead(MeasureUnit::createJoule(status));
    397     measureUnit.adoptInstead(MeasureUnit::createKilocalorie(status));
    398     measureUnit.adoptInstead(MeasureUnit::createKilojoule(status));
    399     measureUnit.adoptInstead(MeasureUnit::createKilowattHour(status));
    400     measureUnit.adoptInstead(MeasureUnit::createGigahertz(status));
    401     measureUnit.adoptInstead(MeasureUnit::createHertz(status));
    402     measureUnit.adoptInstead(MeasureUnit::createKilohertz(status));
    403     measureUnit.adoptInstead(MeasureUnit::createMegahertz(status));
    404     measureUnit.adoptInstead(MeasureUnit::createAstronomicalUnit(status));
    405     measureUnit.adoptInstead(MeasureUnit::createCentimeter(status));
    406     measureUnit.adoptInstead(MeasureUnit::createDecimeter(status));
    407     measureUnit.adoptInstead(MeasureUnit::createFathom(status));
    408     measureUnit.adoptInstead(MeasureUnit::createFoot(status));
    409     measureUnit.adoptInstead(MeasureUnit::createFurlong(status));
    410     measureUnit.adoptInstead(MeasureUnit::createInch(status));
    411     measureUnit.adoptInstead(MeasureUnit::createKilometer(status));
    412     measureUnit.adoptInstead(MeasureUnit::createLightYear(status));
    413     measureUnit.adoptInstead(MeasureUnit::createMeter(status));
    414     measureUnit.adoptInstead(MeasureUnit::createMicrometer(status));
    415     measureUnit.adoptInstead(MeasureUnit::createMile(status));
    416     measureUnit.adoptInstead(MeasureUnit::createMillimeter(status));
    417     measureUnit.adoptInstead(MeasureUnit::createNanometer(status));
    418     measureUnit.adoptInstead(MeasureUnit::createNauticalMile(status));
    419     measureUnit.adoptInstead(MeasureUnit::createParsec(status));
    420     measureUnit.adoptInstead(MeasureUnit::createPicometer(status));
    421     measureUnit.adoptInstead(MeasureUnit::createYard(status));
    422     measureUnit.adoptInstead(MeasureUnit::createLux(status));
    423     measureUnit.adoptInstead(MeasureUnit::createCarat(status));
    424     measureUnit.adoptInstead(MeasureUnit::createGram(status));
    425     measureUnit.adoptInstead(MeasureUnit::createKilogram(status));
    426     measureUnit.adoptInstead(MeasureUnit::createMetricTon(status));
    427     measureUnit.adoptInstead(MeasureUnit::createMicrogram(status));
    428     measureUnit.adoptInstead(MeasureUnit::createMilligram(status));
    429     measureUnit.adoptInstead(MeasureUnit::createOunce(status));
    430     measureUnit.adoptInstead(MeasureUnit::createOunceTroy(status));
    431     measureUnit.adoptInstead(MeasureUnit::createPound(status));
    432     measureUnit.adoptInstead(MeasureUnit::createStone(status));
    433     measureUnit.adoptInstead(MeasureUnit::createTon(status));
    434     measureUnit.adoptInstead(MeasureUnit::createGigawatt(status));
    435     measureUnit.adoptInstead(MeasureUnit::createHorsepower(status));
    436     measureUnit.adoptInstead(MeasureUnit::createKilowatt(status));
    437     measureUnit.adoptInstead(MeasureUnit::createMegawatt(status));
    438     measureUnit.adoptInstead(MeasureUnit::createMilliwatt(status));
    439     measureUnit.adoptInstead(MeasureUnit::createWatt(status));
    440     measureUnit.adoptInstead(MeasureUnit::createHectopascal(status));
    441     measureUnit.adoptInstead(MeasureUnit::createInchHg(status));
    442     measureUnit.adoptInstead(MeasureUnit::createMillibar(status));
    443     measureUnit.adoptInstead(MeasureUnit::createMillimeterOfMercury(status));
    444     measureUnit.adoptInstead(MeasureUnit::createPoundPerSquareInch(status));
    445     measureUnit.adoptInstead(MeasureUnit::createKarat(status));
    446     measureUnit.adoptInstead(MeasureUnit::createKilometerPerHour(status));
    447     measureUnit.adoptInstead(MeasureUnit::createMeterPerSecond(status));
    448     measureUnit.adoptInstead(MeasureUnit::createMilePerHour(status));
    449     measureUnit.adoptInstead(MeasureUnit::createCelsius(status));
    450     measureUnit.adoptInstead(MeasureUnit::createFahrenheit(status));
    451     measureUnit.adoptInstead(MeasureUnit::createGenericTemperature(status));
    452     measureUnit.adoptInstead(MeasureUnit::createKelvin(status));
    453     measureUnit.adoptInstead(MeasureUnit::createAcreFoot(status));
    454     measureUnit.adoptInstead(MeasureUnit::createBushel(status));
    455     measureUnit.adoptInstead(MeasureUnit::createCentiliter(status));
    456     measureUnit.adoptInstead(MeasureUnit::createCubicCentimeter(status));
    457     measureUnit.adoptInstead(MeasureUnit::createCubicFoot(status));
    458     measureUnit.adoptInstead(MeasureUnit::createCubicInch(status));
    459     measureUnit.adoptInstead(MeasureUnit::createCubicKilometer(status));
    460     measureUnit.adoptInstead(MeasureUnit::createCubicMeter(status));
    461     measureUnit.adoptInstead(MeasureUnit::createCubicMile(status));
    462     measureUnit.adoptInstead(MeasureUnit::createCubicYard(status));
    463     measureUnit.adoptInstead(MeasureUnit::createCup(status));
    464     measureUnit.adoptInstead(MeasureUnit::createDeciliter(status));
    465     measureUnit.adoptInstead(MeasureUnit::createFluidOunce(status));
    466     measureUnit.adoptInstead(MeasureUnit::createGallon(status));
    467     measureUnit.adoptInstead(MeasureUnit::createHectoliter(status));
    468     measureUnit.adoptInstead(MeasureUnit::createLiter(status));
    469     measureUnit.adoptInstead(MeasureUnit::createMegaliter(status));
    470     measureUnit.adoptInstead(MeasureUnit::createMilliliter(status));
    471     measureUnit.adoptInstead(MeasureUnit::createPint(status));
    472     measureUnit.adoptInstead(MeasureUnit::createQuart(status));
    473     measureUnit.adoptInstead(MeasureUnit::createTablespoon(status));
    474     measureUnit.adoptInstead(MeasureUnit::createTeaspoon(status));
    475     assertSuccess("", status);
    476 }
    477 
    478 void MeasureFormatTest::TestCompatible56_1() {
    479     UErrorCode status = U_ZERO_ERROR;
    480     LocalPointer<MeasureUnit> measureUnit;
    481     measureUnit.adoptInstead(MeasureUnit::createGForce(status));
    482     measureUnit.adoptInstead(MeasureUnit::createMeterPerSecondSquared(status));
    483     measureUnit.adoptInstead(MeasureUnit::createArcMinute(status));
    484     measureUnit.adoptInstead(MeasureUnit::createArcSecond(status));
    485     measureUnit.adoptInstead(MeasureUnit::createDegree(status));
    486     measureUnit.adoptInstead(MeasureUnit::createRadian(status));
    487     measureUnit.adoptInstead(MeasureUnit::createRevolutionAngle(status));
    488     measureUnit.adoptInstead(MeasureUnit::createAcre(status));
    489     measureUnit.adoptInstead(MeasureUnit::createHectare(status));
    490     measureUnit.adoptInstead(MeasureUnit::createSquareCentimeter(status));
    491     measureUnit.adoptInstead(MeasureUnit::createSquareFoot(status));
    492     measureUnit.adoptInstead(MeasureUnit::createSquareInch(status));
    493     measureUnit.adoptInstead(MeasureUnit::createSquareKilometer(status));
    494     measureUnit.adoptInstead(MeasureUnit::createSquareMeter(status));
    495     measureUnit.adoptInstead(MeasureUnit::createSquareMile(status));
    496     measureUnit.adoptInstead(MeasureUnit::createSquareYard(status));
    497     measureUnit.adoptInstead(MeasureUnit::createLiterPer100Kilometers(status));
    498     measureUnit.adoptInstead(MeasureUnit::createLiterPerKilometer(status));
    499     measureUnit.adoptInstead(MeasureUnit::createMilePerGallon(status));
    500     measureUnit.adoptInstead(MeasureUnit::createBit(status));
    501     measureUnit.adoptInstead(MeasureUnit::createByte(status));
    502     measureUnit.adoptInstead(MeasureUnit::createGigabit(status));
    503     measureUnit.adoptInstead(MeasureUnit::createGigabyte(status));
    504     measureUnit.adoptInstead(MeasureUnit::createKilobit(status));
    505     measureUnit.adoptInstead(MeasureUnit::createKilobyte(status));
    506     measureUnit.adoptInstead(MeasureUnit::createMegabit(status));
    507     measureUnit.adoptInstead(MeasureUnit::createMegabyte(status));
    508     measureUnit.adoptInstead(MeasureUnit::createTerabit(status));
    509     measureUnit.adoptInstead(MeasureUnit::createTerabyte(status));
    510     measureUnit.adoptInstead(MeasureUnit::createCentury(status));
    511     measureUnit.adoptInstead(MeasureUnit::createDay(status));
    512     measureUnit.adoptInstead(MeasureUnit::createHour(status));
    513     measureUnit.adoptInstead(MeasureUnit::createMicrosecond(status));
    514     measureUnit.adoptInstead(MeasureUnit::createMillisecond(status));
    515     measureUnit.adoptInstead(MeasureUnit::createMinute(status));
    516     measureUnit.adoptInstead(MeasureUnit::createMonth(status));
    517     measureUnit.adoptInstead(MeasureUnit::createNanosecond(status));
    518     measureUnit.adoptInstead(MeasureUnit::createSecond(status));
    519     measureUnit.adoptInstead(MeasureUnit::createWeek(status));
    520     measureUnit.adoptInstead(MeasureUnit::createYear(status));
    521     measureUnit.adoptInstead(MeasureUnit::createAmpere(status));
    522     measureUnit.adoptInstead(MeasureUnit::createMilliampere(status));
    523     measureUnit.adoptInstead(MeasureUnit::createOhm(status));
    524     measureUnit.adoptInstead(MeasureUnit::createVolt(status));
    525     measureUnit.adoptInstead(MeasureUnit::createCalorie(status));
    526     measureUnit.adoptInstead(MeasureUnit::createFoodcalorie(status));
    527     measureUnit.adoptInstead(MeasureUnit::createJoule(status));
    528     measureUnit.adoptInstead(MeasureUnit::createKilocalorie(status));
    529     measureUnit.adoptInstead(MeasureUnit::createKilojoule(status));
    530     measureUnit.adoptInstead(MeasureUnit::createKilowattHour(status));
    531     measureUnit.adoptInstead(MeasureUnit::createGigahertz(status));
    532     measureUnit.adoptInstead(MeasureUnit::createHertz(status));
    533     measureUnit.adoptInstead(MeasureUnit::createKilohertz(status));
    534     measureUnit.adoptInstead(MeasureUnit::createMegahertz(status));
    535     measureUnit.adoptInstead(MeasureUnit::createAstronomicalUnit(status));
    536     measureUnit.adoptInstead(MeasureUnit::createCentimeter(status));
    537     measureUnit.adoptInstead(MeasureUnit::createDecimeter(status));
    538     measureUnit.adoptInstead(MeasureUnit::createFathom(status));
    539     measureUnit.adoptInstead(MeasureUnit::createFoot(status));
    540     measureUnit.adoptInstead(MeasureUnit::createFurlong(status));
    541     measureUnit.adoptInstead(MeasureUnit::createInch(status));
    542     measureUnit.adoptInstead(MeasureUnit::createKilometer(status));
    543     measureUnit.adoptInstead(MeasureUnit::createLightYear(status));
    544     measureUnit.adoptInstead(MeasureUnit::createMeter(status));
    545     measureUnit.adoptInstead(MeasureUnit::createMicrometer(status));
    546     measureUnit.adoptInstead(MeasureUnit::createMile(status));
    547     measureUnit.adoptInstead(MeasureUnit::createMileScandinavian(status));
    548     measureUnit.adoptInstead(MeasureUnit::createMillimeter(status));
    549     measureUnit.adoptInstead(MeasureUnit::createNanometer(status));
    550     measureUnit.adoptInstead(MeasureUnit::createNauticalMile(status));
    551     measureUnit.adoptInstead(MeasureUnit::createParsec(status));
    552     measureUnit.adoptInstead(MeasureUnit::createPicometer(status));
    553     measureUnit.adoptInstead(MeasureUnit::createYard(status));
    554     measureUnit.adoptInstead(MeasureUnit::createLux(status));
    555     measureUnit.adoptInstead(MeasureUnit::createCarat(status));
    556     measureUnit.adoptInstead(MeasureUnit::createGram(status));
    557     measureUnit.adoptInstead(MeasureUnit::createKilogram(status));
    558     measureUnit.adoptInstead(MeasureUnit::createMetricTon(status));
    559     measureUnit.adoptInstead(MeasureUnit::createMicrogram(status));
    560     measureUnit.adoptInstead(MeasureUnit::createMilligram(status));
    561     measureUnit.adoptInstead(MeasureUnit::createOunce(status));
    562     measureUnit.adoptInstead(MeasureUnit::createOunceTroy(status));
    563     measureUnit.adoptInstead(MeasureUnit::createPound(status));
    564     measureUnit.adoptInstead(MeasureUnit::createStone(status));
    565     measureUnit.adoptInstead(MeasureUnit::createTon(status));
    566     measureUnit.adoptInstead(MeasureUnit::createGigawatt(status));
    567     measureUnit.adoptInstead(MeasureUnit::createHorsepower(status));
    568     measureUnit.adoptInstead(MeasureUnit::createKilowatt(status));
    569     measureUnit.adoptInstead(MeasureUnit::createMegawatt(status));
    570     measureUnit.adoptInstead(MeasureUnit::createMilliwatt(status));
    571     measureUnit.adoptInstead(MeasureUnit::createWatt(status));
    572     measureUnit.adoptInstead(MeasureUnit::createHectopascal(status));
    573     measureUnit.adoptInstead(MeasureUnit::createInchHg(status));
    574     measureUnit.adoptInstead(MeasureUnit::createMillibar(status));
    575     measureUnit.adoptInstead(MeasureUnit::createMillimeterOfMercury(status));
    576     measureUnit.adoptInstead(MeasureUnit::createPoundPerSquareInch(status));
    577     measureUnit.adoptInstead(MeasureUnit::createKarat(status));
    578     measureUnit.adoptInstead(MeasureUnit::createKilometerPerHour(status));
    579     measureUnit.adoptInstead(MeasureUnit::createKnot(status));
    580     measureUnit.adoptInstead(MeasureUnit::createMeterPerSecond(status));
    581     measureUnit.adoptInstead(MeasureUnit::createMilePerHour(status));
    582     measureUnit.adoptInstead(MeasureUnit::createCelsius(status));
    583     measureUnit.adoptInstead(MeasureUnit::createFahrenheit(status));
    584     measureUnit.adoptInstead(MeasureUnit::createGenericTemperature(status));
    585     measureUnit.adoptInstead(MeasureUnit::createKelvin(status));
    586     measureUnit.adoptInstead(MeasureUnit::createAcreFoot(status));
    587     measureUnit.adoptInstead(MeasureUnit::createBushel(status));
    588     measureUnit.adoptInstead(MeasureUnit::createCentiliter(status));
    589     measureUnit.adoptInstead(MeasureUnit::createCubicCentimeter(status));
    590     measureUnit.adoptInstead(MeasureUnit::createCubicFoot(status));
    591     measureUnit.adoptInstead(MeasureUnit::createCubicInch(status));
    592     measureUnit.adoptInstead(MeasureUnit::createCubicKilometer(status));
    593     measureUnit.adoptInstead(MeasureUnit::createCubicMeter(status));
    594     measureUnit.adoptInstead(MeasureUnit::createCubicMile(status));
    595     measureUnit.adoptInstead(MeasureUnit::createCubicYard(status));
    596     measureUnit.adoptInstead(MeasureUnit::createCup(status));
    597     measureUnit.adoptInstead(MeasureUnit::createCupMetric(status));
    598     measureUnit.adoptInstead(MeasureUnit::createDeciliter(status));
    599     measureUnit.adoptInstead(MeasureUnit::createFluidOunce(status));
    600     measureUnit.adoptInstead(MeasureUnit::createGallon(status));
    601     measureUnit.adoptInstead(MeasureUnit::createHectoliter(status));
    602     measureUnit.adoptInstead(MeasureUnit::createLiter(status));
    603     measureUnit.adoptInstead(MeasureUnit::createMegaliter(status));
    604     measureUnit.adoptInstead(MeasureUnit::createMilliliter(status));
    605     measureUnit.adoptInstead(MeasureUnit::createPint(status));
    606     measureUnit.adoptInstead(MeasureUnit::createPintMetric(status));
    607     measureUnit.adoptInstead(MeasureUnit::createQuart(status));
    608     measureUnit.adoptInstead(MeasureUnit::createTablespoon(status));
    609     measureUnit.adoptInstead(MeasureUnit::createTeaspoon(status));
    610     assertSuccess("", status);
    611 }
    612 
    613 void MeasureFormatTest::TestCompatible57_1() {
    614     UErrorCode status = U_ZERO_ERROR;
    615     LocalPointer<MeasureUnit> measureUnit;
    616     measureUnit.adoptInstead(MeasureUnit::createGForce(status));
    617     measureUnit.adoptInstead(MeasureUnit::createMeterPerSecondSquared(status));
    618     measureUnit.adoptInstead(MeasureUnit::createArcMinute(status));
    619     measureUnit.adoptInstead(MeasureUnit::createArcSecond(status));
    620     measureUnit.adoptInstead(MeasureUnit::createDegree(status));
    621     measureUnit.adoptInstead(MeasureUnit::createRadian(status));
    622     measureUnit.adoptInstead(MeasureUnit::createRevolutionAngle(status));
    623     measureUnit.adoptInstead(MeasureUnit::createAcre(status));
    624     measureUnit.adoptInstead(MeasureUnit::createHectare(status));
    625     measureUnit.adoptInstead(MeasureUnit::createSquareCentimeter(status));
    626     measureUnit.adoptInstead(MeasureUnit::createSquareFoot(status));
    627     measureUnit.adoptInstead(MeasureUnit::createSquareInch(status));
    628     measureUnit.adoptInstead(MeasureUnit::createSquareKilometer(status));
    629     measureUnit.adoptInstead(MeasureUnit::createSquareMeter(status));
    630     measureUnit.adoptInstead(MeasureUnit::createSquareMile(status));
    631     measureUnit.adoptInstead(MeasureUnit::createSquareYard(status));
    632     measureUnit.adoptInstead(MeasureUnit::createKarat(status));
    633     measureUnit.adoptInstead(MeasureUnit::createMilligramPerDeciliter(status));
    634     measureUnit.adoptInstead(MeasureUnit::createMillimolePerLiter(status));
    635     measureUnit.adoptInstead(MeasureUnit::createPartPerMillion(status));
    636     measureUnit.adoptInstead(MeasureUnit::createLiterPer100Kilometers(status));
    637     measureUnit.adoptInstead(MeasureUnit::createLiterPerKilometer(status));
    638     measureUnit.adoptInstead(MeasureUnit::createMilePerGallon(status));
    639     measureUnit.adoptInstead(MeasureUnit::createMilePerGallonImperial(status));
    640     measureUnit.adoptInstead(MeasureUnit::createBit(status));
    641     measureUnit.adoptInstead(MeasureUnit::createByte(status));
    642     measureUnit.adoptInstead(MeasureUnit::createGigabit(status));
    643     measureUnit.adoptInstead(MeasureUnit::createGigabyte(status));
    644     measureUnit.adoptInstead(MeasureUnit::createKilobit(status));
    645     measureUnit.adoptInstead(MeasureUnit::createKilobyte(status));
    646     measureUnit.adoptInstead(MeasureUnit::createMegabit(status));
    647     measureUnit.adoptInstead(MeasureUnit::createMegabyte(status));
    648     measureUnit.adoptInstead(MeasureUnit::createTerabit(status));
    649     measureUnit.adoptInstead(MeasureUnit::createTerabyte(status));
    650     measureUnit.adoptInstead(MeasureUnit::createCentury(status));
    651     measureUnit.adoptInstead(MeasureUnit::createDay(status));
    652     measureUnit.adoptInstead(MeasureUnit::createHour(status));
    653     measureUnit.adoptInstead(MeasureUnit::createMicrosecond(status));
    654     measureUnit.adoptInstead(MeasureUnit::createMillisecond(status));
    655     measureUnit.adoptInstead(MeasureUnit::createMinute(status));
    656     measureUnit.adoptInstead(MeasureUnit::createMonth(status));
    657     measureUnit.adoptInstead(MeasureUnit::createNanosecond(status));
    658     measureUnit.adoptInstead(MeasureUnit::createSecond(status));
    659     measureUnit.adoptInstead(MeasureUnit::createWeek(status));
    660     measureUnit.adoptInstead(MeasureUnit::createYear(status));
    661     measureUnit.adoptInstead(MeasureUnit::createAmpere(status));
    662     measureUnit.adoptInstead(MeasureUnit::createMilliampere(status));
    663     measureUnit.adoptInstead(MeasureUnit::createOhm(status));
    664     measureUnit.adoptInstead(MeasureUnit::createVolt(status));
    665     measureUnit.adoptInstead(MeasureUnit::createCalorie(status));
    666     measureUnit.adoptInstead(MeasureUnit::createFoodcalorie(status));
    667     measureUnit.adoptInstead(MeasureUnit::createJoule(status));
    668     measureUnit.adoptInstead(MeasureUnit::createKilocalorie(status));
    669     measureUnit.adoptInstead(MeasureUnit::createKilojoule(status));
    670     measureUnit.adoptInstead(MeasureUnit::createKilowattHour(status));
    671     measureUnit.adoptInstead(MeasureUnit::createGigahertz(status));
    672     measureUnit.adoptInstead(MeasureUnit::createHertz(status));
    673     measureUnit.adoptInstead(MeasureUnit::createKilohertz(status));
    674     measureUnit.adoptInstead(MeasureUnit::createMegahertz(status));
    675     measureUnit.adoptInstead(MeasureUnit::createAstronomicalUnit(status));
    676     measureUnit.adoptInstead(MeasureUnit::createCentimeter(status));
    677     measureUnit.adoptInstead(MeasureUnit::createDecimeter(status));
    678     measureUnit.adoptInstead(MeasureUnit::createFathom(status));
    679     measureUnit.adoptInstead(MeasureUnit::createFoot(status));
    680     measureUnit.adoptInstead(MeasureUnit::createFurlong(status));
    681     measureUnit.adoptInstead(MeasureUnit::createInch(status));
    682     measureUnit.adoptInstead(MeasureUnit::createKilometer(status));
    683     measureUnit.adoptInstead(MeasureUnit::createLightYear(status));
    684     measureUnit.adoptInstead(MeasureUnit::createMeter(status));
    685     measureUnit.adoptInstead(MeasureUnit::createMicrometer(status));
    686     measureUnit.adoptInstead(MeasureUnit::createMile(status));
    687     measureUnit.adoptInstead(MeasureUnit::createMileScandinavian(status));
    688     measureUnit.adoptInstead(MeasureUnit::createMillimeter(status));
    689     measureUnit.adoptInstead(MeasureUnit::createNanometer(status));
    690     measureUnit.adoptInstead(MeasureUnit::createNauticalMile(status));
    691     measureUnit.adoptInstead(MeasureUnit::createParsec(status));
    692     measureUnit.adoptInstead(MeasureUnit::createPicometer(status));
    693     measureUnit.adoptInstead(MeasureUnit::createYard(status));
    694     measureUnit.adoptInstead(MeasureUnit::createLux(status));
    695     measureUnit.adoptInstead(MeasureUnit::createCarat(status));
    696     measureUnit.adoptInstead(MeasureUnit::createGram(status));
    697     measureUnit.adoptInstead(MeasureUnit::createKilogram(status));
    698     measureUnit.adoptInstead(MeasureUnit::createMetricTon(status));
    699     measureUnit.adoptInstead(MeasureUnit::createMicrogram(status));
    700     measureUnit.adoptInstead(MeasureUnit::createMilligram(status));
    701     measureUnit.adoptInstead(MeasureUnit::createOunce(status));
    702     measureUnit.adoptInstead(MeasureUnit::createOunceTroy(status));
    703     measureUnit.adoptInstead(MeasureUnit::createPound(status));
    704     measureUnit.adoptInstead(MeasureUnit::createStone(status));
    705     measureUnit.adoptInstead(MeasureUnit::createTon(status));
    706     measureUnit.adoptInstead(MeasureUnit::createGigawatt(status));
    707     measureUnit.adoptInstead(MeasureUnit::createHorsepower(status));
    708     measureUnit.adoptInstead(MeasureUnit::createKilowatt(status));
    709     measureUnit.adoptInstead(MeasureUnit::createMegawatt(status));
    710     measureUnit.adoptInstead(MeasureUnit::createMilliwatt(status));
    711     measureUnit.adoptInstead(MeasureUnit::createWatt(status));
    712     measureUnit.adoptInstead(MeasureUnit::createHectopascal(status));
    713     measureUnit.adoptInstead(MeasureUnit::createInchHg(status));
    714     measureUnit.adoptInstead(MeasureUnit::createMillibar(status));
    715     measureUnit.adoptInstead(MeasureUnit::createMillimeterOfMercury(status));
    716     measureUnit.adoptInstead(MeasureUnit::createPoundPerSquareInch(status));
    717     measureUnit.adoptInstead(MeasureUnit::createKilometerPerHour(status));
    718     measureUnit.adoptInstead(MeasureUnit::createKnot(status));
    719     measureUnit.adoptInstead(MeasureUnit::createMeterPerSecond(status));
    720     measureUnit.adoptInstead(MeasureUnit::createMilePerHour(status));
    721     measureUnit.adoptInstead(MeasureUnit::createCelsius(status));
    722     measureUnit.adoptInstead(MeasureUnit::createFahrenheit(status));
    723     measureUnit.adoptInstead(MeasureUnit::createGenericTemperature(status));
    724     measureUnit.adoptInstead(MeasureUnit::createKelvin(status));
    725     measureUnit.adoptInstead(MeasureUnit::createAcreFoot(status));
    726     measureUnit.adoptInstead(MeasureUnit::createBushel(status));
    727     measureUnit.adoptInstead(MeasureUnit::createCentiliter(status));
    728     measureUnit.adoptInstead(MeasureUnit::createCubicCentimeter(status));
    729     measureUnit.adoptInstead(MeasureUnit::createCubicFoot(status));
    730     measureUnit.adoptInstead(MeasureUnit::createCubicInch(status));
    731     measureUnit.adoptInstead(MeasureUnit::createCubicKilometer(status));
    732     measureUnit.adoptInstead(MeasureUnit::createCubicMeter(status));
    733     measureUnit.adoptInstead(MeasureUnit::createCubicMile(status));
    734     measureUnit.adoptInstead(MeasureUnit::createCubicYard(status));
    735     measureUnit.adoptInstead(MeasureUnit::createCup(status));
    736     measureUnit.adoptInstead(MeasureUnit::createCupMetric(status));
    737     measureUnit.adoptInstead(MeasureUnit::createDeciliter(status));
    738     measureUnit.adoptInstead(MeasureUnit::createFluidOunce(status));
    739     measureUnit.adoptInstead(MeasureUnit::createGallon(status));
    740     measureUnit.adoptInstead(MeasureUnit::createGallonImperial(status));
    741     measureUnit.adoptInstead(MeasureUnit::createHectoliter(status));
    742     measureUnit.adoptInstead(MeasureUnit::createLiter(status));
    743     measureUnit.adoptInstead(MeasureUnit::createMegaliter(status));
    744     measureUnit.adoptInstead(MeasureUnit::createMilliliter(status));
    745     measureUnit.adoptInstead(MeasureUnit::createPint(status));
    746     measureUnit.adoptInstead(MeasureUnit::createPintMetric(status));
    747     measureUnit.adoptInstead(MeasureUnit::createQuart(status));
    748     measureUnit.adoptInstead(MeasureUnit::createTablespoon(status));
    749     measureUnit.adoptInstead(MeasureUnit::createTeaspoon(status));
    750     assertSuccess("", status);
    751 }
    752 
    753 void MeasureFormatTest::TestCompatible58_1() {
    754     UErrorCode status = U_ZERO_ERROR;
    755     LocalPointer<MeasureUnit> measureUnit;
    756     measureUnit.adoptInstead(MeasureUnit::createGForce(status));
    757     measureUnit.adoptInstead(MeasureUnit::createMeterPerSecondSquared(status));
    758     measureUnit.adoptInstead(MeasureUnit::createArcMinute(status));
    759     measureUnit.adoptInstead(MeasureUnit::createArcSecond(status));
    760     measureUnit.adoptInstead(MeasureUnit::createDegree(status));
    761     measureUnit.adoptInstead(MeasureUnit::createRadian(status));
    762     measureUnit.adoptInstead(MeasureUnit::createRevolutionAngle(status));
    763     measureUnit.adoptInstead(MeasureUnit::createAcre(status));
    764     measureUnit.adoptInstead(MeasureUnit::createHectare(status));
    765     measureUnit.adoptInstead(MeasureUnit::createSquareCentimeter(status));
    766     measureUnit.adoptInstead(MeasureUnit::createSquareFoot(status));
    767     measureUnit.adoptInstead(MeasureUnit::createSquareInch(status));
    768     measureUnit.adoptInstead(MeasureUnit::createSquareKilometer(status));
    769     measureUnit.adoptInstead(MeasureUnit::createSquareMeter(status));
    770     measureUnit.adoptInstead(MeasureUnit::createSquareMile(status));
    771     measureUnit.adoptInstead(MeasureUnit::createSquareYard(status));
    772     measureUnit.adoptInstead(MeasureUnit::createKarat(status));
    773     measureUnit.adoptInstead(MeasureUnit::createMilligramPerDeciliter(status));
    774     measureUnit.adoptInstead(MeasureUnit::createMillimolePerLiter(status));
    775     measureUnit.adoptInstead(MeasureUnit::createPartPerMillion(status));
    776     measureUnit.adoptInstead(MeasureUnit::createLiterPer100Kilometers(status));
    777     measureUnit.adoptInstead(MeasureUnit::createLiterPerKilometer(status));
    778     measureUnit.adoptInstead(MeasureUnit::createMilePerGallon(status));
    779     measureUnit.adoptInstead(MeasureUnit::createMilePerGallonImperial(status));
    780     measureUnit.adoptInstead(MeasureUnit::createEast(status));
    781     measureUnit.adoptInstead(MeasureUnit::createNorth(status));
    782     measureUnit.adoptInstead(MeasureUnit::createSouth(status));
    783     measureUnit.adoptInstead(MeasureUnit::createWest(status));
    784     measureUnit.adoptInstead(MeasureUnit::createBit(status));
    785     measureUnit.adoptInstead(MeasureUnit::createByte(status));
    786     measureUnit.adoptInstead(MeasureUnit::createGigabit(status));
    787     measureUnit.adoptInstead(MeasureUnit::createGigabyte(status));
    788     measureUnit.adoptInstead(MeasureUnit::createKilobit(status));
    789     measureUnit.adoptInstead(MeasureUnit::createKilobyte(status));
    790     measureUnit.adoptInstead(MeasureUnit::createMegabit(status));
    791     measureUnit.adoptInstead(MeasureUnit::createMegabyte(status));
    792     measureUnit.adoptInstead(MeasureUnit::createTerabit(status));
    793     measureUnit.adoptInstead(MeasureUnit::createTerabyte(status));
    794     measureUnit.adoptInstead(MeasureUnit::createCentury(status));
    795     measureUnit.adoptInstead(MeasureUnit::createDay(status));
    796     measureUnit.adoptInstead(MeasureUnit::createHour(status));
    797     measureUnit.adoptInstead(MeasureUnit::createMicrosecond(status));
    798     measureUnit.adoptInstead(MeasureUnit::createMillisecond(status));
    799     measureUnit.adoptInstead(MeasureUnit::createMinute(status));
    800     measureUnit.adoptInstead(MeasureUnit::createMonth(status));
    801     measureUnit.adoptInstead(MeasureUnit::createNanosecond(status));
    802     measureUnit.adoptInstead(MeasureUnit::createSecond(status));
    803     measureUnit.adoptInstead(MeasureUnit::createWeek(status));
    804     measureUnit.adoptInstead(MeasureUnit::createYear(status));
    805     measureUnit.adoptInstead(MeasureUnit::createAmpere(status));
    806     measureUnit.adoptInstead(MeasureUnit::createMilliampere(status));
    807     measureUnit.adoptInstead(MeasureUnit::createOhm(status));
    808     measureUnit.adoptInstead(MeasureUnit::createVolt(status));
    809     measureUnit.adoptInstead(MeasureUnit::createCalorie(status));
    810     measureUnit.adoptInstead(MeasureUnit::createFoodcalorie(status));
    811     measureUnit.adoptInstead(MeasureUnit::createJoule(status));
    812     measureUnit.adoptInstead(MeasureUnit::createKilocalorie(status));
    813     measureUnit.adoptInstead(MeasureUnit::createKilojoule(status));
    814     measureUnit.adoptInstead(MeasureUnit::createKilowattHour(status));
    815     measureUnit.adoptInstead(MeasureUnit::createGigahertz(status));
    816     measureUnit.adoptInstead(MeasureUnit::createHertz(status));
    817     measureUnit.adoptInstead(MeasureUnit::createKilohertz(status));
    818     measureUnit.adoptInstead(MeasureUnit::createMegahertz(status));
    819     measureUnit.adoptInstead(MeasureUnit::createAstronomicalUnit(status));
    820     measureUnit.adoptInstead(MeasureUnit::createCentimeter(status));
    821     measureUnit.adoptInstead(MeasureUnit::createDecimeter(status));
    822     measureUnit.adoptInstead(MeasureUnit::createFathom(status));
    823     measureUnit.adoptInstead(MeasureUnit::createFoot(status));
    824     measureUnit.adoptInstead(MeasureUnit::createFurlong(status));
    825     measureUnit.adoptInstead(MeasureUnit::createInch(status));
    826     measureUnit.adoptInstead(MeasureUnit::createKilometer(status));
    827     measureUnit.adoptInstead(MeasureUnit::createLightYear(status));
    828     measureUnit.adoptInstead(MeasureUnit::createMeter(status));
    829     measureUnit.adoptInstead(MeasureUnit::createMicrometer(status));
    830     measureUnit.adoptInstead(MeasureUnit::createMile(status));
    831     measureUnit.adoptInstead(MeasureUnit::createMileScandinavian(status));
    832     measureUnit.adoptInstead(MeasureUnit::createMillimeter(status));
    833     measureUnit.adoptInstead(MeasureUnit::createNanometer(status));
    834     measureUnit.adoptInstead(MeasureUnit::createNauticalMile(status));
    835     measureUnit.adoptInstead(MeasureUnit::createParsec(status));
    836     measureUnit.adoptInstead(MeasureUnit::createPicometer(status));
    837     measureUnit.adoptInstead(MeasureUnit::createYard(status));
    838     measureUnit.adoptInstead(MeasureUnit::createLux(status));
    839     measureUnit.adoptInstead(MeasureUnit::createCarat(status));
    840     measureUnit.adoptInstead(MeasureUnit::createGram(status));
    841     measureUnit.adoptInstead(MeasureUnit::createKilogram(status));
    842     measureUnit.adoptInstead(MeasureUnit::createMetricTon(status));
    843     measureUnit.adoptInstead(MeasureUnit::createMicrogram(status));
    844     measureUnit.adoptInstead(MeasureUnit::createMilligram(status));
    845     measureUnit.adoptInstead(MeasureUnit::createOunce(status));
    846     measureUnit.adoptInstead(MeasureUnit::createOunceTroy(status));
    847     measureUnit.adoptInstead(MeasureUnit::createPound(status));
    848     measureUnit.adoptInstead(MeasureUnit::createStone(status));
    849     measureUnit.adoptInstead(MeasureUnit::createTon(status));
    850     measureUnit.adoptInstead(MeasureUnit::createGigawatt(status));
    851     measureUnit.adoptInstead(MeasureUnit::createHorsepower(status));
    852     measureUnit.adoptInstead(MeasureUnit::createKilowatt(status));
    853     measureUnit.adoptInstead(MeasureUnit::createMegawatt(status));
    854     measureUnit.adoptInstead(MeasureUnit::createMilliwatt(status));
    855     measureUnit.adoptInstead(MeasureUnit::createWatt(status));
    856     measureUnit.adoptInstead(MeasureUnit::createHectopascal(status));
    857     measureUnit.adoptInstead(MeasureUnit::createInchHg(status));
    858     measureUnit.adoptInstead(MeasureUnit::createMillibar(status));
    859     measureUnit.adoptInstead(MeasureUnit::createMillimeterOfMercury(status));
    860     measureUnit.adoptInstead(MeasureUnit::createPoundPerSquareInch(status));
    861     measureUnit.adoptInstead(MeasureUnit::createKilometerPerHour(status));
    862     measureUnit.adoptInstead(MeasureUnit::createKnot(status));
    863     measureUnit.adoptInstead(MeasureUnit::createMeterPerSecond(status));
    864     measureUnit.adoptInstead(MeasureUnit::createMilePerHour(status));
    865     measureUnit.adoptInstead(MeasureUnit::createCelsius(status));
    866     measureUnit.adoptInstead(MeasureUnit::createFahrenheit(status));
    867     measureUnit.adoptInstead(MeasureUnit::createGenericTemperature(status));
    868     measureUnit.adoptInstead(MeasureUnit::createKelvin(status));
    869     measureUnit.adoptInstead(MeasureUnit::createAcreFoot(status));
    870     measureUnit.adoptInstead(MeasureUnit::createBushel(status));
    871     measureUnit.adoptInstead(MeasureUnit::createCentiliter(status));
    872     measureUnit.adoptInstead(MeasureUnit::createCubicCentimeter(status));
    873     measureUnit.adoptInstead(MeasureUnit::createCubicFoot(status));
    874     measureUnit.adoptInstead(MeasureUnit::createCubicInch(status));
    875     measureUnit.adoptInstead(MeasureUnit::createCubicKilometer(status));
    876     measureUnit.adoptInstead(MeasureUnit::createCubicMeter(status));
    877     measureUnit.adoptInstead(MeasureUnit::createCubicMile(status));
    878     measureUnit.adoptInstead(MeasureUnit::createCubicYard(status));
    879     measureUnit.adoptInstead(MeasureUnit::createCup(status));
    880     measureUnit.adoptInstead(MeasureUnit::createCupMetric(status));
    881     measureUnit.adoptInstead(MeasureUnit::createDeciliter(status));
    882     measureUnit.adoptInstead(MeasureUnit::createFluidOunce(status));
    883     measureUnit.adoptInstead(MeasureUnit::createGallon(status));
    884     measureUnit.adoptInstead(MeasureUnit::createGallonImperial(status));
    885     measureUnit.adoptInstead(MeasureUnit::createHectoliter(status));
    886     measureUnit.adoptInstead(MeasureUnit::createLiter(status));
    887     measureUnit.adoptInstead(MeasureUnit::createMegaliter(status));
    888     measureUnit.adoptInstead(MeasureUnit::createMilliliter(status));
    889     measureUnit.adoptInstead(MeasureUnit::createPint(status));
    890     measureUnit.adoptInstead(MeasureUnit::createPintMetric(status));
    891     measureUnit.adoptInstead(MeasureUnit::createQuart(status));
    892     measureUnit.adoptInstead(MeasureUnit::createTablespoon(status));
    893     measureUnit.adoptInstead(MeasureUnit::createTeaspoon(status));
    894     assertSuccess("", status);
    895 }
    896 
    897 void MeasureFormatTest::TestBasic() {
    898     UErrorCode status = U_ZERO_ERROR;
    899     MeasureUnit *ptr1 = MeasureUnit::createArcMinute(status);
    900     MeasureUnit *ptr2 = MeasureUnit::createArcMinute(status);
    901     if (!(*ptr1 == *ptr2)) {
    902         errln("Expect == to work.");
    903     }
    904     if (*ptr1 != *ptr2) {
    905         errln("Expect != to work.");
    906     }
    907     MeasureUnit *ptr3 = MeasureUnit::createMeter(status);
    908     if (*ptr1 == *ptr3) {
    909         errln("Expect == to work.");
    910     }
    911     if (!(*ptr1 != *ptr3)) {
    912         errln("Expect != to work.");
    913     }
    914     MeasureUnit *ptr4 = (MeasureUnit *) ptr1->clone();
    915     if (*ptr1 != *ptr4) {
    916         errln("Expect clone to work.");
    917     }
    918     MeasureUnit stack;
    919     stack = *ptr1;
    920     if (*ptr1 != stack) {
    921         errln("Expect assignment to work.");
    922     }
    923 
    924     delete ptr1;
    925     delete ptr2;
    926     delete ptr3;
    927     delete ptr4;
    928 }
    929 
    930 void MeasureFormatTest::TestGetAvailable() {
    931     MeasureUnit *units = NULL;
    932     UErrorCode status = U_ZERO_ERROR;
    933     int32_t totalCount = MeasureUnit::getAvailable(units, 0, status);
    934     while (status == U_BUFFER_OVERFLOW_ERROR) {
    935         status = U_ZERO_ERROR;
    936         delete [] units;
    937         units = new MeasureUnit[totalCount];
    938         totalCount = MeasureUnit::getAvailable(units, totalCount, status);
    939     }
    940     if (U_FAILURE(status)) {
    941         dataerrln("Failure creating format object - %s", u_errorName(status));
    942         delete [] units;
    943         return;
    944     }
    945     if (totalCount < 200) {
    946         errln("Expect at least 200 measure units including currencies.");
    947     }
    948     delete [] units;
    949     StringEnumeration *types = MeasureUnit::getAvailableTypes(status);
    950     if (U_FAILURE(status)) {
    951         dataerrln("Failure getting types - %s", u_errorName(status));
    952         delete types;
    953         return;
    954     }
    955     if (types->count(status) < 10) {
    956         errln("Expect at least 10 distinct unit types.");
    957     }
    958     units = NULL;
    959     int32_t unitCapacity = 0;
    960     int32_t unitCountSum = 0;
    961     for (
    962             const char* type = types->next(NULL, status);
    963             type != NULL;
    964             type = types->next(NULL, status)) {
    965         int32_t unitCount = MeasureUnit::getAvailable(type, units, unitCapacity, status);
    966         while (status == U_BUFFER_OVERFLOW_ERROR) {
    967             status = U_ZERO_ERROR;
    968             delete [] units;
    969             units = new MeasureUnit[unitCount];
    970             unitCapacity = unitCount;
    971             unitCount = MeasureUnit::getAvailable(type, units, unitCapacity, status);
    972         }
    973         if (U_FAILURE(status)) {
    974             dataerrln("Failure getting units - %s", u_errorName(status));
    975             delete [] units;
    976             delete types;
    977             return;
    978         }
    979         if (unitCount < 1) {
    980             errln("Expect at least one unit count per type.");
    981         }
    982         unitCountSum += unitCount;
    983     }
    984     if (unitCountSum != totalCount) {
    985         errln("Expected total unit count to equal sum of unit counts by type.");
    986     }
    987     delete [] units;
    988     delete types;
    989 }
    990 
    991 void MeasureFormatTest::TestExamplesInDocs() {
    992     UErrorCode status = U_ZERO_ERROR;
    993     MeasureFormat fmtFr(Locale::getFrench(), UMEASFMT_WIDTH_SHORT, status);
    994     MeasureFormat fmtFrFull(
    995             Locale::getFrench(), UMEASFMT_WIDTH_WIDE, status);
    996     MeasureFormat fmtFrNarrow(
    997             Locale::getFrench(), UMEASFMT_WIDTH_NARROW, status);
    998     MeasureFormat fmtEn(Locale::getUS(), UMEASFMT_WIDTH_WIDE, status);
    999     if (!assertSuccess("Error creating formatters", status)) {
   1000         return;
   1001     }
   1002     Measure measureC((double)23, MeasureUnit::createCelsius(status), status);
   1003     Measure measureF((double)70, MeasureUnit::createFahrenheit(status), status);
   1004     Measure feetAndInches[] = {
   1005             Measure((double)70, MeasureUnit::createFoot(status), status),
   1006             Measure((double)5.3, MeasureUnit::createInch(status), status)};
   1007     Measure footAndInch[] = {
   1008             Measure((double)1, MeasureUnit::createFoot(status), status),
   1009             Measure((double)1, MeasureUnit::createInch(status), status)};
   1010     Measure inchAndFeet[] = {
   1011             Measure((double)1, MeasureUnit::createInch(status), status),
   1012             Measure((double)2, MeasureUnit::createFoot(status), status)};
   1013     if (!assertSuccess("Error creating measurements.", status)) {
   1014         return;
   1015     }
   1016     verifyFormat(
   1017             "Celsius",
   1018             fmtFr,
   1019             &measureC,
   1020             1,
   1021             "23 \\u00B0C");
   1022     verifyFormatWithPrefix(
   1023             "Celsius",
   1024             fmtFr,
   1025             "Prefix: ",
   1026             &measureC,
   1027             1,
   1028             "Prefix: 23 \\u00B0C");
   1029     verifyFormat(
   1030             "Fahrenheit",
   1031             fmtFr,
   1032             &measureF,
   1033             1,
   1034             "70 \\u00B0F");
   1035     verifyFormat(
   1036             "Feet and inches",
   1037             fmtFrFull,
   1038             feetAndInches,
   1039             UPRV_LENGTHOF(feetAndInches),
   1040             "70 pieds et 5,3 pouces");
   1041     verifyFormatWithPrefix(
   1042             "Feet and inches",
   1043             fmtFrFull,
   1044             "Prefix: ",
   1045             feetAndInches,
   1046             UPRV_LENGTHOF(feetAndInches),
   1047             "Prefix: 70 pieds et 5,3 pouces");
   1048     verifyFormat(
   1049             "Foot and inch",
   1050             fmtFrFull,
   1051             footAndInch,
   1052             UPRV_LENGTHOF(footAndInch),
   1053             "1 pied et 1 pouce");
   1054     verifyFormat(
   1055             "Foot and inch narrow",
   1056             fmtFrNarrow,
   1057             footAndInch,
   1058             UPRV_LENGTHOF(footAndInch),
   1059             "1\\u2032 1\\u2033");
   1060     verifyFormat(
   1061             "Inch and feet",
   1062             fmtEn,
   1063             inchAndFeet,
   1064             UPRV_LENGTHOF(inchAndFeet),
   1065             "1 inch, 2 feet");
   1066 }
   1067 
   1068 void MeasureFormatTest::TestFormatPeriodEn() {
   1069     UErrorCode status = U_ZERO_ERROR;
   1070     Measure t_19m[] = {Measure((double)19, MeasureUnit::createMinute(status), status)};
   1071     Measure t_1h_23_5s[] = {
   1072             Measure((double)1.0, MeasureUnit::createHour(status), status),
   1073             Measure((double)23.5, MeasureUnit::createSecond(status), status)
   1074     };
   1075     Measure t_1h_23_5m[] = {
   1076             Measure((double)1.0, MeasureUnit::createHour(status), status),
   1077             Measure((double)23.5, MeasureUnit::createMinute(status), status)
   1078     };
   1079     Measure t_1h_0m_23s[] = {
   1080             Measure(
   1081                     (double)1.0,
   1082                     TimeUnit::createInstance(
   1083                             TimeUnit::UTIMEUNIT_HOUR, status),
   1084                     status),
   1085             Measure(
   1086                     (double)0.0,
   1087                     TimeUnit::createInstance(
   1088                             TimeUnit::UTIMEUNIT_MINUTE, status),
   1089                      status),
   1090             Measure(
   1091                     (double)23.0,
   1092                     TimeUnit::createInstance(
   1093                             TimeUnit::UTIMEUNIT_SECOND, status),
   1094                     status)
   1095     };
   1096     Measure t_2y_5M_3w_4d[] = {
   1097             Measure(2.0, MeasureUnit::createYear(status), status),
   1098             Measure(5.0, MeasureUnit::createMonth(status), status),
   1099             Measure(3.0, MeasureUnit::createWeek(status), status),
   1100             Measure(4.0, MeasureUnit::createDay(status), status)
   1101     };
   1102     Measure t_1m_59_9996s[] = {
   1103             Measure(1.0, MeasureUnit::createMinute(status), status),
   1104             Measure(59.9996, MeasureUnit::createSecond(status), status)
   1105     };
   1106     Measure t_5h_17m[] = {
   1107             Measure(5.0, MeasureUnit::createHour(status), status),
   1108             Measure(17.0, MeasureUnit::createMinute(status), status)
   1109     };
   1110     Measure t_neg5h_17m[] = {
   1111             Measure(-5.0, MeasureUnit::createHour(status), status),
   1112             Measure(17.0, MeasureUnit::createMinute(status), status)
   1113     };
   1114     Measure t_19m_28s[] = {
   1115             Measure(19.0, MeasureUnit::createMinute(status), status),
   1116             Measure(28.0, MeasureUnit::createSecond(status), status)
   1117     };
   1118     Measure t_0h_0m_9s[] = {
   1119             Measure(0.0, MeasureUnit::createHour(status), status),
   1120             Measure(0.0, MeasureUnit::createMinute(status), status),
   1121             Measure(9.0, MeasureUnit::createSecond(status), status)
   1122     };
   1123     Measure t_0h_0m_17s[] = {
   1124             Measure(0.0, MeasureUnit::createHour(status), status),
   1125             Measure(0.0, MeasureUnit::createMinute(status), status),
   1126             Measure(17.0, MeasureUnit::createSecond(status), status)
   1127     };
   1128     Measure t_6h_56_92m[] = {
   1129             Measure(6.0, MeasureUnit::createHour(status), status),
   1130             Measure(56.92, MeasureUnit::createMinute(status), status)
   1131     };
   1132     Measure t_3h_4s_5m[] = {
   1133             Measure(3.0, MeasureUnit::createHour(status), status),
   1134             Measure(4.0, MeasureUnit::createSecond(status), status),
   1135             Measure(5.0, MeasureUnit::createMinute(status), status)
   1136     };
   1137     Measure t_6_7h_56_92m[] = {
   1138             Measure(6.7, MeasureUnit::createHour(status), status),
   1139             Measure(56.92, MeasureUnit::createMinute(status), status)
   1140     };
   1141 
   1142     Measure t_3h_5h[] = {
   1143             Measure(3.0, MeasureUnit::createHour(status), status),
   1144             Measure(5.0, MeasureUnit::createHour(status), status)
   1145     };
   1146 
   1147     if (!assertSuccess("Error creating Measure objects", status)) {
   1148         return;
   1149     }
   1150 
   1151     ExpectedResult fullData[] = {
   1152             {t_1m_59_9996s, UPRV_LENGTHOF(t_1m_59_9996s), "1 minute, 59.9996 seconds"},
   1153             {t_19m, UPRV_LENGTHOF(t_19m), "19 minutes"},
   1154             {t_1h_23_5s, UPRV_LENGTHOF(t_1h_23_5s), "1 hour, 23.5 seconds"},
   1155             {t_1h_23_5m, UPRV_LENGTHOF(t_1h_23_5m), "1 hour, 23.5 minutes"},
   1156             {t_1h_0m_23s, UPRV_LENGTHOF(t_1h_0m_23s), "1 hour, 0 minutes, 23 seconds"},
   1157             {t_2y_5M_3w_4d, UPRV_LENGTHOF(t_2y_5M_3w_4d), "2 years, 5 months, 3 weeks, 4 days"}};
   1158 
   1159     ExpectedResult abbrevData[] = {
   1160             {t_1m_59_9996s, UPRV_LENGTHOF(t_1m_59_9996s), "1 min, 59.9996 sec"},
   1161             {t_19m, UPRV_LENGTHOF(t_19m), "19 min"},
   1162             {t_1h_23_5s, UPRV_LENGTHOF(t_1h_23_5s), "1 hr, 23.5 sec"},
   1163             {t_1h_23_5m, UPRV_LENGTHOF(t_1h_23_5m), "1 hr, 23.5 min"},
   1164             {t_1h_0m_23s, UPRV_LENGTHOF(t_1h_0m_23s), "1 hr, 0 min, 23 sec"},
   1165             {t_2y_5M_3w_4d, UPRV_LENGTHOF(t_2y_5M_3w_4d), "2 yrs, 5 mths, 3 wks, 4 days"}};
   1166 
   1167     ExpectedResult narrowData[] = {
   1168             {t_1m_59_9996s, UPRV_LENGTHOF(t_1m_59_9996s), "1m 59.9996s"},
   1169             {t_19m, UPRV_LENGTHOF(t_19m), "19m"},
   1170             {t_1h_23_5s, UPRV_LENGTHOF(t_1h_23_5s), "1h 23.5s"},
   1171             {t_1h_23_5m, UPRV_LENGTHOF(t_1h_23_5m), "1h 23.5m"},
   1172             {t_1h_0m_23s, UPRV_LENGTHOF(t_1h_0m_23s), "1h 0m 23s"},
   1173             {t_2y_5M_3w_4d, UPRV_LENGTHOF(t_2y_5M_3w_4d), "2y 5m 3w 4d"}};
   1174 
   1175     ExpectedResult numericData[] = {
   1176             {t_1m_59_9996s, UPRV_LENGTHOF(t_1m_59_9996s), "1:59.9996"},
   1177             {t_19m, UPRV_LENGTHOF(t_19m), "19m"},
   1178             {t_1h_23_5s, UPRV_LENGTHOF(t_1h_23_5s), "1:00:23.5"},
   1179             {t_1h_23_5m, UPRV_LENGTHOF(t_1h_23_5m), "1:23.5"},
   1180             {t_1h_0m_23s, UPRV_LENGTHOF(t_1h_0m_23s), "1:00:23"},
   1181             {t_5h_17m, UPRV_LENGTHOF(t_5h_17m), "5:17"},
   1182             {t_neg5h_17m, UPRV_LENGTHOF(t_neg5h_17m), "-5h 17m"},
   1183             {t_19m_28s, UPRV_LENGTHOF(t_19m_28s), "19:28"},
   1184             {t_2y_5M_3w_4d, UPRV_LENGTHOF(t_2y_5M_3w_4d), "2y 5m 3w 4d"},
   1185             {t_0h_0m_9s, UPRV_LENGTHOF(t_0h_0m_9s), "0:00:09"},
   1186             {t_6h_56_92m, UPRV_LENGTHOF(t_6h_56_92m), "6:56.92"},
   1187             {t_6_7h_56_92m, UPRV_LENGTHOF(t_6_7h_56_92m), "6:56.92"},
   1188             {t_3h_4s_5m, UPRV_LENGTHOF(t_3h_4s_5m), "3h 4s 5m"},
   1189             {t_3h_5h, UPRV_LENGTHOF(t_3h_5h), "3h 5h"}};
   1190 
   1191     ExpectedResult fullDataDe[] = {
   1192             {t_1m_59_9996s, UPRV_LENGTHOF(t_1m_59_9996s), "1 Minute, 59,9996 Sekunden"},
   1193             {t_19m, UPRV_LENGTHOF(t_19m), "19 Minuten"},
   1194             {t_1h_23_5s, UPRV_LENGTHOF(t_1h_23_5s), "1 Stunde, 23,5 Sekunden"},
   1195             {t_1h_23_5m, UPRV_LENGTHOF(t_1h_23_5m), "1 Stunde, 23,5 Minuten"},
   1196             {t_1h_0m_23s, UPRV_LENGTHOF(t_1h_0m_23s), "1 Stunde, 0 Minuten und 23 Sekunden"},
   1197             {t_2y_5M_3w_4d, UPRV_LENGTHOF(t_2y_5M_3w_4d), "2 Jahre, 5 Monate, 3 Wochen und 4 Tage"}};
   1198 
   1199     ExpectedResult numericDataDe[] = {
   1200             {t_1m_59_9996s, UPRV_LENGTHOF(t_1m_59_9996s), "1:59,9996"},
   1201             {t_19m, UPRV_LENGTHOF(t_19m), "19 Min."},
   1202             {t_1h_23_5s, UPRV_LENGTHOF(t_1h_23_5s), "1:00:23,5"},
   1203             {t_1h_23_5m, UPRV_LENGTHOF(t_1h_23_5m), "1:23,5"},
   1204             {t_1h_0m_23s, UPRV_LENGTHOF(t_1h_0m_23s), "1:00:23"},
   1205             {t_5h_17m, UPRV_LENGTHOF(t_5h_17m), "5:17"},
   1206             {t_19m_28s, UPRV_LENGTHOF(t_19m_28s), "19:28"},
   1207             {t_2y_5M_3w_4d, UPRV_LENGTHOF(t_2y_5M_3w_4d), "2 J, 5 M, 3 W und 4 T"},
   1208             {t_0h_0m_17s, UPRV_LENGTHOF(t_0h_0m_17s), "0:00:17"},
   1209             {t_6h_56_92m, UPRV_LENGTHOF(t_6h_56_92m), "6:56,92"},
   1210             {t_3h_5h, UPRV_LENGTHOF(t_3h_5h), "3 Std., 5 Std."}};
   1211 
   1212     Locale en(Locale::getEnglish());
   1213     LocalPointer<NumberFormat> nf(NumberFormat::createInstance(en, status));
   1214     if (U_FAILURE(status)) {
   1215         dataerrln("Error creating number format en object - %s", u_errorName(status));
   1216         return;
   1217     }
   1218     nf->setMaximumFractionDigits(4);
   1219     MeasureFormat mf(en, UMEASFMT_WIDTH_WIDE, (NumberFormat *) nf->clone(), status);
   1220     if (!assertSuccess("Error creating measure format en WIDE", status)) {
   1221         return;
   1222     }
   1223     verifyFormat("en WIDE", mf, fullData, UPRV_LENGTHOF(fullData));
   1224 
   1225     // exercise copy constructor
   1226     {
   1227         MeasureFormat mf2(mf);
   1228         verifyFormat("en WIDE copy", mf2, fullData, UPRV_LENGTHOF(fullData));
   1229     }
   1230     // exercise clone
   1231     {
   1232         MeasureFormat *mf3 = (MeasureFormat *) mf.clone();
   1233         verifyFormat("en WIDE copy", *mf3, fullData, UPRV_LENGTHOF(fullData));
   1234         delete mf3;
   1235     }
   1236     mf = MeasureFormat(en, UMEASFMT_WIDTH_SHORT, (NumberFormat *) nf->clone(), status);
   1237     if (!assertSuccess("Error creating measure format en SHORT", status)) {
   1238         return;
   1239     }
   1240     verifyFormat("en SHORT", mf, abbrevData, UPRV_LENGTHOF(abbrevData));
   1241     mf = MeasureFormat(en, UMEASFMT_WIDTH_NARROW, (NumberFormat *) nf->clone(), status);
   1242     if (!assertSuccess("Error creating measure format en NARROW", status)) {
   1243         return;
   1244     }
   1245     verifyFormat("en NARROW", mf, narrowData, UPRV_LENGTHOF(narrowData));
   1246     mf = MeasureFormat(en, UMEASFMT_WIDTH_NUMERIC, (NumberFormat *) nf->clone(), status);
   1247     if (!assertSuccess("Error creating measure format en NUMERIC", status)) {
   1248         return;
   1249     }
   1250     verifyFormat("en NUMERIC", mf, numericData, UPRV_LENGTHOF(numericData));
   1251 
   1252     Locale de(Locale::getGerman());
   1253     nf.adoptInstead(NumberFormat::createInstance(de, status));
   1254     if (!assertSuccess("Error creating number format de object", status)) {
   1255         return;
   1256     }
   1257     nf->setMaximumFractionDigits(4);
   1258     mf = MeasureFormat(de, UMEASFMT_WIDTH_WIDE, (NumberFormat *) nf->clone(), status);
   1259     if (!assertSuccess("Error creating measure format de WIDE", status)) {
   1260         return;
   1261     }
   1262     verifyFormat("de WIDE", mf, fullDataDe, UPRV_LENGTHOF(fullDataDe));
   1263     mf = MeasureFormat(de, UMEASFMT_WIDTH_NUMERIC, (NumberFormat *) nf->clone(), status);
   1264     if (!assertSuccess("Error creating measure format de NUMERIC", status)) {
   1265         return;
   1266     }
   1267     verifyFormat("de NUMERIC", mf, numericDataDe, UPRV_LENGTHOF(numericDataDe));
   1268 }
   1269 
   1270 void MeasureFormatTest::Test10219FractionalPlurals() {
   1271     Locale en(Locale::getEnglish());
   1272     double values[] = {1.588, 1.011};
   1273     const char *expected[2][3] = {
   1274             {"1 minute", "1.5 minutes", "1.58 minutes"},
   1275             {"1 minute", "1.0 minutes", "1.01 minutes"}
   1276     };
   1277     UErrorCode status = U_ZERO_ERROR;
   1278     for (int j = 0; j < UPRV_LENGTHOF(values); j++) {
   1279         for (int i = 0; i < UPRV_LENGTHOF(expected[j]); i++) {
   1280             DecimalFormat *df =
   1281                 (DecimalFormat *) NumberFormat::createInstance(en, status);
   1282             if (U_FAILURE(status)) {
   1283                 dataerrln("Error creating Number format - %s", u_errorName(status));
   1284                 return;
   1285             }
   1286             df->setRoundingMode(DecimalFormat::kRoundDown);
   1287             df->setMinimumFractionDigits(i);
   1288             df->setMaximumFractionDigits(i);
   1289             MeasureFormat mf(en, UMEASFMT_WIDTH_WIDE, df, status);
   1290             if (!assertSuccess("Error creating Measure format", status)) {
   1291                 return;
   1292             }
   1293             Measure measure(values[j], MeasureUnit::createMinute(status), status);
   1294             if (!assertSuccess("Error creating Measure unit", status)) {
   1295                 return;
   1296             }
   1297             verifyFormat("Test10219", mf, &measure, 1, expected[j][i]);
   1298         }
   1299     }
   1300 }
   1301 
   1302 static MeasureUnit toMeasureUnit(MeasureUnit *adopted) {
   1303     MeasureUnit result(*adopted);
   1304     delete adopted;
   1305     return result;
   1306 }
   1307 
   1308 void MeasureFormatTest::TestGreek() {
   1309     Locale locales[] = {Locale("el_GR"), Locale("el")};
   1310     UErrorCode status = U_ZERO_ERROR;
   1311     MeasureUnit units[] = {
   1312         toMeasureUnit(MeasureUnit::createSecond(status)),
   1313         toMeasureUnit(MeasureUnit::createMinute(status)),
   1314         toMeasureUnit(MeasureUnit::createHour(status)),
   1315         toMeasureUnit(MeasureUnit::createDay(status)),
   1316         toMeasureUnit(MeasureUnit::createWeek(status)),
   1317         toMeasureUnit(MeasureUnit::createMonth(status)),
   1318         toMeasureUnit(MeasureUnit::createYear(status))};
   1319     if (!assertSuccess("Error creating Measure units", status)) {
   1320         return;
   1321     }
   1322     UMeasureFormatWidth styles[] = {
   1323             UMEASFMT_WIDTH_WIDE,
   1324             UMEASFMT_WIDTH_SHORT};
   1325     int32_t numbers[] = {1, 7};
   1326     const char *expected[] = {
   1327         // "el_GR" 1 wide
   1328         "1 \\u03B4\\u03B5\\u03C5\\u03C4\\u03B5\\u03C1\\u03CC\\u03BB\\u03B5\\u03C0\\u03C4\\u03BF",
   1329         "1 \\u03BB\\u03B5\\u03C0\\u03C4\\u03CC",
   1330         "1 \\u03CE\\u03C1\\u03B1",
   1331         "1 \\u03B7\\u03BC\\u03AD\\u03C1\\u03B1",
   1332         "1 \\u03B5\\u03B2\\u03B4\\u03BF\\u03BC\\u03AC\\u03B4\\u03B1",
   1333         "1 \\u03BC\\u03AE\\u03BD\\u03B1\\u03C2",
   1334         "1 \\u03AD\\u03C4\\u03BF\\u03C2",
   1335         // "el_GR" 1 short
   1336         "1 \\u03B4\\u03B5\\u03C5\\u03C4.",
   1337         "1 \\u03BB\\u03B5\\u03C0.",
   1338         "1 \\u03CE\\u03C1\\u03B1",
   1339         "1 \\u03B7\\u03BC\\u03AD\\u03C1\\u03B1",
   1340         "1 \\u03B5\\u03B2\\u03B4.",
   1341         "1 \\u03BC\\u03AE\\u03BD.",
   1342         "1 \\u03AD\\u03C4.",	        // year (one)
   1343         // "el_GR" 7 wide
   1344         "7 \\u03B4\\u03B5\\u03C5\\u03C4\\u03B5\\u03C1\\u03CC\\u03BB\\u03B5\\u03C0\\u03C4\\u03B1",
   1345         "7 \\u03BB\\u03B5\\u03C0\\u03C4\\u03AC",
   1346         "7 \\u03CE\\u03C1\\u03B5\\u03C2",
   1347         "7 \\u03B7\\u03BC\\u03AD\\u03C1\\u03B5\\u03C2",
   1348         "7 \\u03B5\\u03B2\\u03B4\\u03BF\\u03BC\\u03AC\\u03B4\\u03B5\\u03C2",
   1349         "7 \\u03BC\\u03AE\\u03BD\\u03B5\\u03C2",
   1350         "7 \\u03AD\\u03C4\\u03B7",
   1351         // "el_GR" 7 short
   1352         "7 \\u03B4\\u03B5\\u03C5\\u03C4.",
   1353         "7 \\u03BB\\u03B5\\u03C0.",
   1354         "7 \\u03CE\\u03C1.",		    // hour (other)
   1355         "7 \\u03B7\\u03BC\\u03AD\\u03C1\\u03B5\\u03C2",
   1356         "7 \\u03B5\\u03B2\\u03B4.",
   1357         "7 \\u03BC\\u03AE\\u03BD.",
   1358         "7 \\u03AD\\u03C4.",            // year (other)
   1359 
   1360         // "el" 1 wide
   1361         "1 \\u03B4\\u03B5\\u03C5\\u03C4\\u03B5\\u03C1\\u03CC\\u03BB\\u03B5\\u03C0\\u03C4\\u03BF",
   1362         "1 \\u03BB\\u03B5\\u03C0\\u03C4\\u03CC",
   1363         "1 \\u03CE\\u03C1\\u03B1",
   1364         "1 \\u03B7\\u03BC\\u03AD\\u03C1\\u03B1",
   1365         "1 \\u03B5\\u03B2\\u03B4\\u03BF\\u03BC\\u03AC\\u03B4\\u03B1",
   1366         "1 \\u03BC\\u03AE\\u03BD\\u03B1\\u03C2",
   1367         "1 \\u03AD\\u03C4\\u03BF\\u03C2",
   1368         // "el" 1 short
   1369         "1 \\u03B4\\u03B5\\u03C5\\u03C4.",
   1370         "1 \\u03BB\\u03B5\\u03C0.",
   1371         "1 \\u03CE\\u03C1\\u03B1",
   1372         "1 \\u03B7\\u03BC\\u03AD\\u03C1\\u03B1",
   1373         "1 \\u03B5\\u03B2\\u03B4.",
   1374         "1 \\u03BC\\u03AE\\u03BD.",
   1375         "1 \\u03AD\\u03C4.",	        // year (one)
   1376         // "el" 7 wide
   1377         "7 \\u03B4\\u03B5\\u03C5\\u03C4\\u03B5\\u03C1\\u03CC\\u03BB\\u03B5\\u03C0\\u03C4\\u03B1",
   1378         "7 \\u03BB\\u03B5\\u03C0\\u03C4\\u03AC",
   1379         "7 \\u03CE\\u03C1\\u03B5\\u03C2",
   1380         "7 \\u03B7\\u03BC\\u03AD\\u03C1\\u03B5\\u03C2",
   1381         "7 \\u03B5\\u03B2\\u03B4\\u03BF\\u03BC\\u03AC\\u03B4\\u03B5\\u03C2",
   1382         "7 \\u03BC\\u03AE\\u03BD\\u03B5\\u03C2",
   1383         "7 \\u03AD\\u03C4\\u03B7",
   1384         // "el" 7 short
   1385         "7 \\u03B4\\u03B5\\u03C5\\u03C4.",
   1386         "7 \\u03BB\\u03B5\\u03C0.",
   1387         "7 \\u03CE\\u03C1.",		    // hour (other)
   1388         "7 \\u03B7\\u03BC\\u03AD\\u03C1\\u03B5\\u03C2",
   1389         "7 \\u03B5\\u03B2\\u03B4.",
   1390         "7 \\u03BC\\u03AE\\u03BD.",
   1391         "7 \\u03AD\\u03C4."};           // year (other)
   1392 
   1393     int32_t counter = 0;
   1394     for (int32_t locIndex = 0; locIndex < UPRV_LENGTHOF(locales); ++locIndex ) {
   1395         for( int32_t numIndex = 0; numIndex < UPRV_LENGTHOF(numbers); ++numIndex ) {
   1396             for ( int32_t styleIndex = 0; styleIndex < UPRV_LENGTHOF(styles); ++styleIndex ) {
   1397                 for ( int32_t unitIndex = 0; unitIndex < UPRV_LENGTHOF(units); ++unitIndex ) {
   1398                     Measure measure(numbers[numIndex], new MeasureUnit(units[unitIndex]), status);
   1399                     if (!assertSuccess("Error creating Measure", status)) {
   1400                         return;
   1401                     }
   1402                     MeasureFormat fmt(locales[locIndex], styles[styleIndex], status);
   1403                     if (!assertSuccess("Error creating Measure format", status)) {
   1404                         return;
   1405                     }
   1406                     verifyFormat("TestGreek", fmt, &measure, 1, expected[counter]);
   1407                     ++counter;
   1408                 }
   1409             }
   1410         }
   1411     }
   1412 }
   1413 
   1414 void MeasureFormatTest::TestFormatSingleArg() {
   1415     UErrorCode status = U_ZERO_ERROR;
   1416     MeasureFormat fmt("en", UMEASFMT_WIDTH_WIDE, status);
   1417     if (!assertSuccess("Error creating formatter", status)) {
   1418         return;
   1419     }
   1420     UnicodeString buffer;
   1421     FieldPosition pos(FieldPosition::DONT_CARE);
   1422     fmt.format(
   1423             new Measure(3.5, MeasureUnit::createFoot(status), status),
   1424             buffer,
   1425             pos,
   1426             status);
   1427     if (!assertSuccess("Error formatting", status)) {
   1428         return;
   1429     }
   1430     assertEquals(
   1431             "TestFormatSingleArg",
   1432             UnicodeString("3.5 feet"),
   1433             buffer);
   1434 }
   1435 
   1436 void MeasureFormatTest::TestFormatMeasuresZeroArg() {
   1437     UErrorCode status = U_ZERO_ERROR;
   1438     MeasureFormat fmt("en", UMEASFMT_WIDTH_WIDE, status);
   1439     verifyFormat("TestFormatMeasuresZeroArg", fmt, NULL, 0, "");
   1440 }
   1441 
   1442 void MeasureFormatTest::TestSimplePer() {
   1443     Locale en("en");
   1444     UErrorCode status = U_ZERO_ERROR;
   1445     LocalPointer<MeasureUnit> second(MeasureUnit::createSecond(status));
   1446     LocalPointer<MeasureUnit> minute(MeasureUnit::createMinute(status));
   1447     LocalPointer<MeasureUnit> pound(MeasureUnit::createPound(status));
   1448     if (!assertSuccess("", status)) {
   1449         return;
   1450     }
   1451 
   1452     helperTestSimplePer(
   1453             en, UMEASFMT_WIDTH_WIDE,
   1454             1.0, *pound, *second, "1 pound per second");
   1455     helperTestSimplePer(
   1456             en, UMEASFMT_WIDTH_WIDE,
   1457             2.0, *pound, *second, "2 pounds per second");
   1458     helperTestSimplePer(
   1459             en, UMEASFMT_WIDTH_WIDE,
   1460             1.0, *pound, *minute, "1 pound per minute");
   1461     helperTestSimplePer(
   1462             en, UMEASFMT_WIDTH_WIDE,
   1463             2.0, *pound, *minute, "2 pounds per minute");
   1464 
   1465     helperTestSimplePer(
   1466             en, UMEASFMT_WIDTH_SHORT, 1.0, *pound, *second, "1 lb/s");
   1467     helperTestSimplePer(
   1468             en, UMEASFMT_WIDTH_SHORT, 2.0, *pound, *second, "2 lb/s");
   1469     helperTestSimplePer(
   1470             en, UMEASFMT_WIDTH_SHORT, 1.0, *pound, *minute, "1 lb/min");
   1471     helperTestSimplePer(
   1472             en, UMEASFMT_WIDTH_SHORT, 2.0, *pound, *minute, "2 lb/min");
   1473 
   1474     helperTestSimplePer(
   1475             en, UMEASFMT_WIDTH_NARROW, 1.0, *pound, *second, "1#/s");
   1476     helperTestSimplePer(
   1477             en, UMEASFMT_WIDTH_NARROW, 2.0, *pound, *second, "2#/s");
   1478     helperTestSimplePer(
   1479             en, UMEASFMT_WIDTH_NARROW, 1.0, *pound, *minute, "1#/min");
   1480     helperTestSimplePer(
   1481             en, UMEASFMT_WIDTH_NARROW, 2.0, *pound, *minute, "2#/min");
   1482 
   1483     helperTestSimplePer(
   1484             en, UMEASFMT_WIDTH_SHORT,
   1485             23.3, *pound, *second, "23.3 lb/s",
   1486             NumberFormat::kDecimalSeparatorField,
   1487             2, 3);
   1488 
   1489     helperTestSimplePer(
   1490             en, UMEASFMT_WIDTH_SHORT,
   1491             23.3, *pound, *second, "23.3 lb/s",
   1492             NumberFormat::kIntegerField,
   1493             0, 2);
   1494 
   1495     helperTestSimplePer(
   1496             en, UMEASFMT_WIDTH_SHORT,
   1497             23.3, *pound, *minute, "23.3 lb/min",
   1498             NumberFormat::kDecimalSeparatorField,
   1499             2, 3);
   1500 
   1501     helperTestSimplePer(
   1502             en, UMEASFMT_WIDTH_SHORT,
   1503             23.3, *pound, *minute, "23.3 lb/min",
   1504             NumberFormat::kIntegerField,
   1505             0, 2);
   1506 }
   1507 
   1508 void MeasureFormatTest::TestNumeratorPlurals() {
   1509     Locale pl("pl");
   1510     UErrorCode status = U_ZERO_ERROR;
   1511     LocalPointer<MeasureUnit> second(MeasureUnit::createSecond(status));
   1512     LocalPointer<MeasureUnit> foot(MeasureUnit::createFoot(status));
   1513     if (!assertSuccess("", status)) {
   1514         return;
   1515     }
   1516 
   1517     helperTestSimplePer(
   1518             pl,
   1519             UMEASFMT_WIDTH_WIDE,
   1520             1.0, *foot, *second, "1 stopa na sekund\\u0119");
   1521     helperTestSimplePer(
   1522             pl,
   1523             UMEASFMT_WIDTH_WIDE,
   1524             2.0, *foot, *second, "2 stopy na sekund\\u0119");
   1525     helperTestSimplePer(
   1526             pl,
   1527             UMEASFMT_WIDTH_WIDE,
   1528             5.0, *foot, *second, "5 st\\u00f3p na sekund\\u0119");
   1529     helperTestSimplePer(
   1530             pl, UMEASFMT_WIDTH_WIDE,
   1531             1.5, *foot, *second, "1,5 stopy na sekund\\u0119");
   1532 }
   1533 
   1534 void MeasureFormatTest::helperTestSimplePer(
   1535         const Locale &locale,
   1536         UMeasureFormatWidth width,
   1537         double value,
   1538         const MeasureUnit &unit,
   1539         const MeasureUnit &perUnit,
   1540         const char *expected) {
   1541     helperTestSimplePer(
   1542             locale,
   1543             width,
   1544             value,
   1545             unit,
   1546             perUnit,
   1547             expected,
   1548             FieldPosition::DONT_CARE,
   1549             0,
   1550             0);
   1551 }
   1552 
   1553 void MeasureFormatTest::helperTestSimplePer(
   1554         const Locale &locale,
   1555         UMeasureFormatWidth width,
   1556         double value,
   1557         const MeasureUnit &unit,
   1558         const MeasureUnit &perUnit,
   1559         const char *expected,
   1560         int32_t field,
   1561         int32_t expected_start,
   1562         int32_t expected_end) {
   1563     UErrorCode status = U_ZERO_ERROR;
   1564     FieldPosition pos(field);
   1565     MeasureFormat fmt(locale, width, status);
   1566     if (!assertSuccess("Error creating format object", status)) {
   1567         return;
   1568     }
   1569     Measure measure(value, (MeasureUnit *) unit.clone(), status);
   1570     if (!assertSuccess("Error creating measure object", status)) {
   1571         return;
   1572     }
   1573     UnicodeString prefix("prefix: ");
   1574     UnicodeString buffer(prefix);
   1575     fmt.formatMeasurePerUnit(
   1576             measure,
   1577             perUnit,
   1578             buffer,
   1579             pos,
   1580             status);
   1581     if (!assertSuccess("Error formatting measures with per", status)) {
   1582         return;
   1583     }
   1584     UnicodeString uexpected(expected);
   1585     uexpected = prefix + uexpected;
   1586     assertEquals(
   1587             "TestSimplePer",
   1588             uexpected.unescape(),
   1589             buffer);
   1590     if (field != FieldPosition::DONT_CARE) {
   1591         assertEquals(
   1592                 "Start", expected_start, pos.getBeginIndex() - prefix.length());
   1593         assertEquals(
   1594                 "End", expected_end, pos.getEndIndex() - prefix.length());
   1595     }
   1596 }
   1597 
   1598 void MeasureFormatTest::TestMultiples() {
   1599     Locale ru("ru");
   1600     Locale en("en");
   1601     helperTestMultiples(en, UMEASFMT_WIDTH_WIDE, "2 miles, 1 foot, 2.3 inches");
   1602     helperTestMultiples(en, UMEASFMT_WIDTH_SHORT, "2 mi, 1 ft, 2.3 in");
   1603     helperTestMultiples(en, UMEASFMT_WIDTH_NARROW, "2mi 1\\u2032 2.3\\u2033");
   1604     helperTestMultiples(ru, UMEASFMT_WIDTH_WIDE, "2 \\u043C\\u0438\\u043B\\u0438 1 \\u0444\\u0443\\u0442 \\u0438 2,3 \\u0434\\u044E\\u0439\\u043C\\u0430");
   1605     helperTestMultiples(ru, UMEASFMT_WIDTH_SHORT, "2 \\u043C\\u0438\\u043B\\u0438 1 \\u0444\\u0443\\u0442 \\u0438 2,3 \\u0434\\u044E\\u0439\\u043C.");
   1606     helperTestMultiples(ru, UMEASFMT_WIDTH_NARROW, "2 \\u043C\\u0438\\u043B\\u044C 1 \\u0444\\u0443\\u0442 2,3 \\u0434\\u044E\\u0439\\u043C\\u0430");
   1607 }
   1608 
   1609 void MeasureFormatTest::helperTestMultiples(
   1610         const Locale &locale,
   1611         UMeasureFormatWidth width,
   1612         const char *expected) {
   1613     UErrorCode status = U_ZERO_ERROR;
   1614     FieldPosition pos(FieldPosition::DONT_CARE);
   1615     MeasureFormat fmt(locale, width, status);
   1616     if (!assertSuccess("Error creating format object", status)) {
   1617         return;
   1618     }
   1619     Measure measures[] = {
   1620             Measure(2.0, MeasureUnit::createMile(status), status),
   1621             Measure(1.0, MeasureUnit::createFoot(status), status),
   1622             Measure(2.3, MeasureUnit::createInch(status), status)};
   1623     if (!assertSuccess("Error creating measures", status)) {
   1624         return;
   1625     }
   1626     UnicodeString buffer;
   1627     fmt.formatMeasures(measures, UPRV_LENGTHOF(measures), buffer, pos, status);
   1628     if (!assertSuccess("Error formatting measures", status)) {
   1629         return;
   1630     }
   1631     assertEquals("TestMultiples", UnicodeString(expected).unescape(), buffer);
   1632 }
   1633 
   1634 void MeasureFormatTest::TestManyLocaleDurations() {
   1635     UErrorCode status = U_ZERO_ERROR;
   1636     Measure measures[] = {
   1637             Measure(5.0, MeasureUnit::createHour(status), status),
   1638             Measure(37.0, MeasureUnit::createMinute(status), status)};
   1639     if (!assertSuccess("Error creating measures", status)) {
   1640         return;
   1641     }
   1642     helperTestManyLocaleDurations("da", UMEASFMT_WIDTH_NARROW,  measures, UPRV_LENGTHOF(measures), "5 t og 37 min");
   1643     helperTestManyLocaleDurations("da", UMEASFMT_WIDTH_NUMERIC, measures, UPRV_LENGTHOF(measures), "5.37");
   1644     helperTestManyLocaleDurations("de", UMEASFMT_WIDTH_NARROW,  measures, UPRV_LENGTHOF(measures), "5 Std., 37 Min.");
   1645     helperTestManyLocaleDurations("de", UMEASFMT_WIDTH_NUMERIC, measures, UPRV_LENGTHOF(measures), "5:37");
   1646     helperTestManyLocaleDurations("en", UMEASFMT_WIDTH_NARROW,  measures, UPRV_LENGTHOF(measures), "5h 37m");
   1647     helperTestManyLocaleDurations("en", UMEASFMT_WIDTH_NUMERIC, measures, UPRV_LENGTHOF(measures), "5:37");
   1648     helperTestManyLocaleDurations("es", UMEASFMT_WIDTH_NARROW,  measures, UPRV_LENGTHOF(measures), "5h 37min");
   1649     helperTestManyLocaleDurations("es", UMEASFMT_WIDTH_NUMERIC, measures, UPRV_LENGTHOF(measures), "5:37");
   1650     helperTestManyLocaleDurations("fi", UMEASFMT_WIDTH_NARROW,  measures, UPRV_LENGTHOF(measures), "5t 37min");
   1651     helperTestManyLocaleDurations("fi", UMEASFMT_WIDTH_NUMERIC, measures, UPRV_LENGTHOF(measures), "5.37");
   1652     helperTestManyLocaleDurations("fr", UMEASFMT_WIDTH_NARROW,  measures, UPRV_LENGTHOF(measures), "5h 37m");
   1653     helperTestManyLocaleDurations("fr", UMEASFMT_WIDTH_NUMERIC, measures, UPRV_LENGTHOF(measures), "05:37");
   1654     helperTestManyLocaleDurations("is", UMEASFMT_WIDTH_NARROW,  measures, UPRV_LENGTHOF(measures), "5 klst. og 37 m\\u00EDn.");
   1655     helperTestManyLocaleDurations("is", UMEASFMT_WIDTH_NUMERIC, measures, UPRV_LENGTHOF(measures), "5:37");
   1656     helperTestManyLocaleDurations("ja", UMEASFMT_WIDTH_NARROW,  measures, UPRV_LENGTHOF(measures), "5h37m");
   1657     helperTestManyLocaleDurations("ja", UMEASFMT_WIDTH_NUMERIC, measures, UPRV_LENGTHOF(measures), "5:37");
   1658     helperTestManyLocaleDurations("nb", UMEASFMT_WIDTH_NARROW,  measures, UPRV_LENGTHOF(measures), "5t, 37m");
   1659     helperTestManyLocaleDurations("nb", UMEASFMT_WIDTH_NUMERIC, measures, UPRV_LENGTHOF(measures), "5:37");
   1660     helperTestManyLocaleDurations("nl", UMEASFMT_WIDTH_NARROW,  measures, UPRV_LENGTHOF(measures), "5 u, 37 m");
   1661     helperTestManyLocaleDurations("nl", UMEASFMT_WIDTH_NUMERIC, measures, UPRV_LENGTHOF(measures), "5:37");
   1662     helperTestManyLocaleDurations("nn", UMEASFMT_WIDTH_NARROW,  measures, UPRV_LENGTHOF(measures), "5 h og 37 min");
   1663     helperTestManyLocaleDurations("nn", UMEASFMT_WIDTH_NUMERIC, measures, UPRV_LENGTHOF(measures), "5:37");
   1664     helperTestManyLocaleDurations("sv", UMEASFMT_WIDTH_NARROW,  measures, UPRV_LENGTHOF(measures), "5h 37m");
   1665     helperTestManyLocaleDurations("sv", UMEASFMT_WIDTH_NUMERIC, measures, UPRV_LENGTHOF(measures), "5:37");
   1666     helperTestManyLocaleDurations("zh", UMEASFMT_WIDTH_NARROW,  measures, UPRV_LENGTHOF(measures), "5\\u5C0F\\u65F637\\u5206\\u949F");
   1667     helperTestManyLocaleDurations("zh", UMEASFMT_WIDTH_NUMERIC, measures, UPRV_LENGTHOF(measures), "5:37");
   1668 }
   1669 
   1670 void MeasureFormatTest::helperTestManyLocaleDurations( const char *localeID,
   1671                                                        UMeasureFormatWidth width,
   1672                                                        const Measure *measures,
   1673                                                        int32_t measureCount,
   1674                                                        const char *expected) {
   1675     UErrorCode status = U_ZERO_ERROR;
   1676     MeasureFormat fmt(Locale(localeID), width, status);
   1677     if (U_FAILURE(status)) {
   1678         errln("Could not create MeasureFormat for locale %s, width %d, status: %s", localeID, (int)width, u_errorName(status));
   1679         return;
   1680     }
   1681     UnicodeString buffer;
   1682     FieldPosition pos(FieldPosition::DONT_CARE);
   1683     fmt.formatMeasures(measures, measureCount, buffer, pos, status);
   1684     if (U_FAILURE(status)) {
   1685         errln("MeasureFormat::formatMeasures failed for locale %s, width %d, status: %s", localeID, (int)width, u_errorName(status));
   1686         return;
   1687     }
   1688     UnicodeString expStr(UnicodeString(expected).unescape());
   1689     if (buffer != expStr) {
   1690         errln("MeasureFormat::formatMeasures for locale " + UnicodeString(localeID) + ", width " + width + ", expected \"" + expStr + "\", got \"" + buffer + "\"");
   1691     }
   1692 }
   1693 
   1694 void MeasureFormatTest::TestGram() {
   1695     UErrorCode status = U_ZERO_ERROR;
   1696     MeasureFormat fmt("en", UMEASFMT_WIDTH_SHORT, status);
   1697     if (!assertSuccess("Error creating format object", status)) {
   1698         return;
   1699     }
   1700     Measure gram((double)1, MeasureUnit::createGram(status), status);
   1701     Measure gforce((double)1, MeasureUnit::createGForce(status), status);
   1702     if (!assertSuccess("Error creating measures", status)) {
   1703         return;
   1704     }
   1705     verifyFormat("TestGram", fmt, &gram, 1, "1 g");
   1706     verifyFormat("TestGram", fmt, &gforce, 1, "1 G");
   1707 }
   1708 
   1709 void MeasureFormatTest::TestCurrencies() {
   1710     UChar USD[4];
   1711     u_uastrcpy(USD, "USD");
   1712     UErrorCode status = U_ZERO_ERROR;
   1713     CurrencyAmount USD_1(1.0, USD, status);
   1714     assertEquals("Currency Code", USD, USD_1.getISOCurrency());
   1715     CurrencyAmount USD_2(2.0, USD, status);
   1716     CurrencyAmount USD_NEG_1(-1.0, USD, status);
   1717     if (!assertSuccess("Error creating currencies", status)) {
   1718         return;
   1719     }
   1720     Locale en("en");
   1721     MeasureFormat fmt(en, UMEASFMT_WIDTH_WIDE, status);
   1722     if (!assertSuccess("Error creating format object", status)) {
   1723         return;
   1724     }
   1725     verifyFormat("TestCurrenciesWide", fmt, &USD_NEG_1, 1, "-1.00 US dollars");
   1726     verifyFormat("TestCurrenciesWide", fmt, &USD_1, 1, "1.00 US dollars");
   1727     verifyFormat("TestCurrenciesWide", fmt, &USD_2, 1, "2.00 US dollars");
   1728     fmt = MeasureFormat(en, UMEASFMT_WIDTH_SHORT, status);
   1729     if (!assertSuccess("Error creating format object", status)) {
   1730         return;
   1731     }
   1732     verifyFormat("TestCurrenciesShort", fmt, &USD_NEG_1, 1, "-USD1.00");
   1733     verifyFormat("TestCurrenciesShort", fmt, &USD_1, 1, "USD1.00");
   1734     verifyFormat("TestCurrenciesShort", fmt, &USD_2, 1, "USD2.00");
   1735     fmt = MeasureFormat(en, UMEASFMT_WIDTH_NARROW, status);
   1736     if (!assertSuccess("Error creating format object", status)) {
   1737         return;
   1738     }
   1739     verifyFormat("TestCurrenciesNarrow", fmt, &USD_NEG_1, 1, "-$1.00");
   1740     verifyFormat("TestCurrenciesNarrow", fmt, &USD_1, 1, "$1.00");
   1741     verifyFormat("TestCurrenciesNarrow", fmt, &USD_2, 1, "$2.00");
   1742     fmt = MeasureFormat(en, UMEASFMT_WIDTH_NUMERIC, status);
   1743     if (!assertSuccess("Error creating format object", status)) {
   1744         return;
   1745     }
   1746     verifyFormat("TestCurrenciesNumeric", fmt, &USD_NEG_1, 1, "-$1.00");
   1747     verifyFormat("TestCurrenciesNumeric", fmt, &USD_1, 1, "$1.00");
   1748     verifyFormat("TestCurrenciesNumeric", fmt, &USD_2, 1, "$2.00");
   1749 }
   1750 
   1751 void MeasureFormatTest::TestDisplayNames() {
   1752     UErrorCode status = U_ZERO_ERROR;
   1753     helperTestDisplayName( MeasureUnit::createYear(status), "en", UMEASFMT_WIDTH_WIDE, "years" );
   1754     helperTestDisplayName( MeasureUnit::createYear(status), "ja", UMEASFMT_WIDTH_WIDE, "\\u5E74" );
   1755     helperTestDisplayName( MeasureUnit::createYear(status), "es", UMEASFMT_WIDTH_WIDE, "a\\u00F1os" );
   1756     helperTestDisplayName( MeasureUnit::createYear(status), "pt", UMEASFMT_WIDTH_WIDE, "anos" );
   1757     helperTestDisplayName( MeasureUnit::createYear(status), "pt-PT", UMEASFMT_WIDTH_WIDE, "anos" );
   1758     helperTestDisplayName( MeasureUnit::createAmpere(status), "en", UMEASFMT_WIDTH_WIDE, "amperes" );
   1759     helperTestDisplayName( MeasureUnit::createAmpere(status), "ja", UMEASFMT_WIDTH_WIDE, "\\u30A2\\u30F3\\u30DA\\u30A2" );
   1760     helperTestDisplayName( MeasureUnit::createAmpere(status), "es", UMEASFMT_WIDTH_WIDE, "amperios" );
   1761     helperTestDisplayName( MeasureUnit::createAmpere(status), "pt", UMEASFMT_WIDTH_WIDE, "amperes" );
   1762     helperTestDisplayName( MeasureUnit::createAmpere(status), "pt-PT", UMEASFMT_WIDTH_WIDE, "amperes" );
   1763     helperTestDisplayName( MeasureUnit::createMeterPerSecondSquared(status), "pt", UMEASFMT_WIDTH_WIDE, "metros por segundo ao quadrado" );
   1764     helperTestDisplayName( MeasureUnit::createMeterPerSecondSquared(status), "pt-PT", UMEASFMT_WIDTH_WIDE, "metros por segundo quadrado" );
   1765     helperTestDisplayName( MeasureUnit::createSquareKilometer(status), "pt", UMEASFMT_WIDTH_NARROW, "km\\u00B2" );
   1766     helperTestDisplayName( MeasureUnit::createSquareKilometer(status), "pt", UMEASFMT_WIDTH_SHORT, "km\\u00B2" );
   1767     helperTestDisplayName( MeasureUnit::createSquareKilometer(status), "pt", UMEASFMT_WIDTH_WIDE, "quil\\u00F4metros quadrados" );
   1768     helperTestDisplayName( MeasureUnit::createSecond(status), "pt-PT", UMEASFMT_WIDTH_NARROW, "s" );
   1769     helperTestDisplayName( MeasureUnit::createSecond(status), "pt-PT", UMEASFMT_WIDTH_SHORT, "s" );
   1770     helperTestDisplayName( MeasureUnit::createSecond(status), "pt-PT", UMEASFMT_WIDTH_WIDE, "segundos" );
   1771     helperTestDisplayName( MeasureUnit::createSecond(status), "pt", UMEASFMT_WIDTH_NARROW, "seg" );
   1772     helperTestDisplayName( MeasureUnit::createSecond(status), "pt", UMEASFMT_WIDTH_SHORT, "segs" );
   1773     helperTestDisplayName( MeasureUnit::createSecond(status), "pt", UMEASFMT_WIDTH_WIDE, "segundos" );
   1774     assertSuccess("Error creating measure units", status);
   1775 }
   1776 
   1777 void MeasureFormatTest::helperTestDisplayName(const MeasureUnit *unit,
   1778                             const char *localeID,
   1779                             UMeasureFormatWidth width,
   1780                             const char *expected) {
   1781     UErrorCode status = U_ZERO_ERROR;
   1782     MeasureFormat fmt(Locale(localeID), width, status);
   1783     if (U_FAILURE(status)) {
   1784         errln("Could not create MeasureFormat for locale %s, width %d, status: %s",
   1785             localeID, (int)width, u_errorName(status));
   1786         return;
   1787     }
   1788 
   1789     UnicodeString dnam = fmt.getUnitDisplayName(*unit, status);
   1790     if (U_FAILURE(status)) {
   1791         errln("MeasureFormat::getUnitDisplayName failed for unit %s-%s, locale %s, width %d, status: %s",
   1792             unit->getType(), unit->getSubtype(), localeID, (int)width, u_errorName(status));
   1793         return;
   1794     }
   1795 
   1796     UnicodeString expStr(UnicodeString(expected).unescape());
   1797     if (dnam != expStr) {
   1798         errln("MeasureFormat::getUnitDisplayName for unit %s-%s, locale %s, width %d: expected \"%s\", got \"%s\"",
   1799             unit->getType(), unit->getSubtype(), localeID, (int)width, CStr(expStr)(), CStr(dnam)());
   1800     }
   1801 
   1802     // Delete the measure unit
   1803     delete unit;
   1804 }
   1805 
   1806 void MeasureFormatTest::TestFieldPosition() {
   1807     UErrorCode status = U_ZERO_ERROR;
   1808     MeasureFormat fmt("en", UMEASFMT_WIDTH_SHORT, status);
   1809     if (!assertSuccess("Error creating format object", status)) {
   1810         return;
   1811     }
   1812     Measure measure(43.5, MeasureUnit::createFoot(status), status);
   1813     if (!assertSuccess("Error creating measure object 1", status)) {
   1814         return;
   1815     }
   1816     UnicodeString prefix("123456: ");
   1817     verifyFieldPosition(
   1818             "",
   1819             fmt,
   1820             prefix,
   1821             &measure,
   1822             1,
   1823             NumberFormat::kDecimalSeparatorField,
   1824             10,
   1825             11);
   1826     measure = Measure(43.0, MeasureUnit::createFoot(status), status);
   1827     if (!assertSuccess("Error creating measure object 2", status)) {
   1828         return;
   1829     }
   1830     verifyFieldPosition(
   1831             "",
   1832             fmt,
   1833             prefix,
   1834             &measure,
   1835             1,
   1836             NumberFormat::kDecimalSeparatorField,
   1837             0,
   1838             0);
   1839 }
   1840 
   1841 void MeasureFormatTest::TestFieldPositionMultiple() {
   1842     UErrorCode status = U_ZERO_ERROR;
   1843     MeasureFormat fmt("en", UMEASFMT_WIDTH_SHORT, status);
   1844     if (!assertSuccess("Error creating format object", status)) {
   1845         return;
   1846     }
   1847     Measure first[] = {
   1848       Measure((double)354, MeasureUnit::createMeter(status), status),
   1849       Measure((double)23, MeasureUnit::createCentimeter(status), status)};
   1850     Measure second[] = {
   1851       Measure((double)354, MeasureUnit::createMeter(status), status),
   1852       Measure((double)23, MeasureUnit::createCentimeter(status), status),
   1853       Measure((double)5.4, MeasureUnit::createMillimeter(status), status)};
   1854     Measure third[] = {
   1855       Measure((double)3, MeasureUnit::createMeter(status), status),
   1856       Measure((double)23, MeasureUnit::createCentimeter(status), status),
   1857       Measure((double)5, MeasureUnit::createMillimeter(status), status)};
   1858     if (!assertSuccess("Error creating measure objects", status)) {
   1859         return;
   1860     }
   1861     UnicodeString prefix("123456: ");
   1862     verifyFieldPosition(
   1863             "Integer",
   1864             fmt,
   1865             prefix,
   1866             first,
   1867             UPRV_LENGTHOF(first),
   1868             NumberFormat::kIntegerField,
   1869             8,
   1870             11);
   1871     verifyFieldPosition(
   1872             "Decimal separator",
   1873             fmt,
   1874             prefix,
   1875             second,
   1876             UPRV_LENGTHOF(second),
   1877             NumberFormat::kDecimalSeparatorField,
   1878             23,
   1879             24);
   1880     verifyFieldPosition(
   1881             "no decimal separator",
   1882             fmt,
   1883             prefix,
   1884             third,
   1885             UPRV_LENGTHOF(third),
   1886             NumberFormat::kDecimalSeparatorField,
   1887             0,
   1888             0);
   1889 }
   1890 
   1891 void MeasureFormatTest::TestBadArg() {
   1892     UErrorCode status = U_ZERO_ERROR;
   1893     MeasureFormat fmt("en", UMEASFMT_WIDTH_SHORT, status);
   1894     if (!assertSuccess("Error creating format object", status)) {
   1895         return;
   1896     }
   1897     FieldPosition pos(FieldPosition::DONT_CARE);
   1898     UnicodeString buffer;
   1899     fmt.format(
   1900             9.3,
   1901             buffer,
   1902             pos,
   1903             status);
   1904     if (status != U_ILLEGAL_ARGUMENT_ERROR) {
   1905         errln("Expected ILLEGAL_ARGUMENT_ERROR");
   1906     }
   1907 }
   1908 
   1909 void MeasureFormatTest::TestEquality() {
   1910     UErrorCode status = U_ZERO_ERROR;
   1911     NumberFormat* nfeq = NumberFormat::createInstance("en", status);
   1912     NumberFormat* nfne = NumberFormat::createInstance("fr", status);
   1913     MeasureFormat fmt("en", UMEASFMT_WIDTH_SHORT, status);
   1914     MeasureFormat fmtEq2("en", UMEASFMT_WIDTH_SHORT, nfeq, status);
   1915     MeasureFormat fmtne1("en", UMEASFMT_WIDTH_WIDE, status);
   1916     MeasureFormat fmtne2("fr", UMEASFMT_WIDTH_SHORT, status);
   1917     MeasureFormat fmtne3("en", UMEASFMT_WIDTH_SHORT, nfne, status);
   1918     if (U_FAILURE(status)) {
   1919         dataerrln("Error creating MeasureFormats - %s", u_errorName(status));
   1920         return;
   1921     }
   1922     MeasureFormat fmtEq(fmt);
   1923     assertTrue("Equal", fmt == fmtEq);
   1924     assertTrue("Equal2", fmt == fmtEq2);
   1925     assertFalse("Equal Neg", fmt != fmtEq);
   1926     assertTrue("Not Equal 1", fmt != fmtne1);
   1927     assertFalse("Not Equal Neg 1", fmt == fmtne1);
   1928     assertTrue("Not Equal 2", fmt != fmtne2);
   1929     assertTrue("Not Equal 3", fmt != fmtne3);
   1930 }
   1931 
   1932 void MeasureFormatTest::TestGroupingSeparator() {
   1933     UErrorCode status = U_ZERO_ERROR;
   1934     Locale en("en");
   1935     MeasureFormat fmt(en, UMEASFMT_WIDTH_SHORT, status);
   1936     if (!assertSuccess("Error creating format object", status)) {
   1937         return;
   1938     }
   1939     Measure ms[] = {
   1940             Measure((int32_t)INT32_MAX, MeasureUnit::createYear(status), status),
   1941             Measure((int32_t)INT32_MIN, MeasureUnit::createMonth(status), status),
   1942             Measure(-987.0, MeasureUnit::createDay(status), status),
   1943             Measure(1362.0, MeasureUnit::createHour(status), status),
   1944             Measure(987.0, MeasureUnit::createMinute(status), status)};
   1945     FieldPosition pos(NumberFormat::kGroupingSeparatorField);
   1946     UnicodeString appendTo;
   1947     fmt.formatMeasures(ms, 5, appendTo, pos, status);
   1948     if (!assertSuccess("Error formatting", status)) {
   1949         return;
   1950     }
   1951     assertEquals(
   1952             "grouping separator",
   1953             "2,147,483,647 yrs, -2,147,483,648 mths, -987 days, 1,362 hr, 987 min",
   1954             appendTo);
   1955     assertEquals("begin index", 9, pos.getBeginIndex());
   1956     assertEquals("end index", 10, pos.getEndIndex());
   1957 }
   1958 
   1959 void MeasureFormatTest::TestDoubleZero() {
   1960     UErrorCode status = U_ZERO_ERROR;
   1961     Measure measures[] = {
   1962         Measure(4.7, MeasureUnit::createHour(status), status),
   1963         Measure(23.0, MeasureUnit::createMinute(status), status),
   1964         Measure(16.0, MeasureUnit::createSecond(status), status)};
   1965     Locale en("en");
   1966     NumberFormat *nf = NumberFormat::createInstance(en, status);
   1967     MeasureFormat fmt("en", UMEASFMT_WIDTH_WIDE, nf, status);
   1968     UnicodeString appendTo;
   1969     FieldPosition pos(FieldPosition::DONT_CARE);
   1970     if (U_FAILURE(status)) {
   1971         dataerrln("Error creating formatter - %s", u_errorName(status));
   1972         return;
   1973     }
   1974     nf->setMinimumFractionDigits(2);
   1975     nf->setMaximumFractionDigits(2);
   1976     fmt.formatMeasures(measures, UPRV_LENGTHOF(measures), appendTo, pos, status);
   1977     if (!assertSuccess("Error formatting", status)) {
   1978         return;
   1979     }
   1980     assertEquals(
   1981             "TestDoubleZero",
   1982             UnicodeString("4 hours, 23 minutes, 16.00 seconds"),
   1983             appendTo);
   1984     measures[0] = Measure(-4.7, MeasureUnit::createHour(status), status);
   1985     appendTo.remove();
   1986     fmt.formatMeasures(measures, UPRV_LENGTHOF(measures), appendTo, pos, status);
   1987     if (!assertSuccess("Error formatting", status)) {
   1988         return;
   1989     }
   1990     assertEquals(
   1991             "TestDoubleZero",
   1992             UnicodeString("-4 hours, 23 minutes, 16.00 seconds"),
   1993             appendTo);
   1994 }
   1995 
   1996 void MeasureFormatTest::TestUnitPerUnitResolution() {
   1997     UErrorCode status = U_ZERO_ERROR;
   1998     Locale en("en");
   1999     MeasureFormat fmt("en", UMEASFMT_WIDTH_SHORT, status);
   2000     Measure measure(50.0, MeasureUnit::createPound(status), status);
   2001     LocalPointer<MeasureUnit> sqInch(MeasureUnit::createSquareInch(status));
   2002     if (!assertSuccess("Create of format unit and per unit", status)) {
   2003         return;
   2004     }
   2005     FieldPosition pos(FieldPosition::DONT_CARE);
   2006     UnicodeString actual;
   2007     fmt.formatMeasurePerUnit(
   2008             measure,
   2009             *sqInch,
   2010             actual,
   2011             pos,
   2012             status);
   2013     assertEquals("", "50 psi", actual);
   2014 }
   2015 
   2016 void MeasureFormatTest::TestIndividualPluralFallback() {
   2017     // See ticket #11986 "incomplete fallback in MeasureFormat".
   2018     // In CLDR 28, fr_CA temperature-generic/short has only the "one" form,
   2019     // and falls back to fr for the "other" form.
   2020     IcuTestErrorCode errorCode(*this, "TestIndividualPluralFallback");
   2021     MeasureFormat mf("fr_CA", UMEASFMT_WIDTH_SHORT, errorCode);
   2022     LocalPointer<Measure> twoDeg(
   2023         new Measure(2.0, MeasureUnit::createGenericTemperature(errorCode), errorCode), errorCode);
   2024     UnicodeString expected = UNICODE_STRING_SIMPLE("2\\u00B0").unescape();
   2025     UnicodeString actual;
   2026     assertEquals("2 deg temp in fr_CA", expected, mf.format(twoDeg.orphan(), actual, errorCode), TRUE);
   2027 }
   2028 
   2029 void MeasureFormatTest::verifyFieldPosition(
   2030         const char *description,
   2031         const MeasureFormat &fmt,
   2032         const UnicodeString &prefix,
   2033         const Measure *measures,
   2034         int32_t measureCount,
   2035         NumberFormat::EAlignmentFields field,
   2036         int32_t start,
   2037         int32_t end) {
   2038     // 8 char lead
   2039     UnicodeString result(prefix);
   2040     FieldPosition pos(field);
   2041     UErrorCode status = U_ZERO_ERROR;
   2042     CharString ch;
   2043     const char *descPrefix = ch.append(description, status)
   2044             .append(": ", status).data();
   2045     CharString beginIndex;
   2046     beginIndex.append(descPrefix, status).append("beginIndex", status);
   2047     CharString endIndex;
   2048     endIndex.append(descPrefix, status).append("endIndex", status);
   2049     fmt.formatMeasures(measures, measureCount, result, pos, status);
   2050     if (!assertSuccess("Error formatting", status)) {
   2051         return;
   2052     }
   2053     assertEquals(beginIndex.data(), start, pos.getBeginIndex());
   2054     assertEquals(endIndex.data(), end, pos.getEndIndex());
   2055 }
   2056 
   2057 void MeasureFormatTest::verifyFormat(
   2058         const char *description,
   2059         const MeasureFormat &fmt,
   2060         const Measure *measures,
   2061         int32_t measureCount,
   2062         const char *expected) {
   2063     verifyFormatWithPrefix(
   2064             description,
   2065             fmt,
   2066             "",
   2067             measures,
   2068             measureCount,
   2069             expected);
   2070 }
   2071 
   2072 void MeasureFormatTest::verifyFormatWithPrefix(
   2073         const char *description,
   2074         const MeasureFormat &fmt,
   2075         const UnicodeString &prefix,
   2076         const Measure *measures,
   2077         int32_t measureCount,
   2078         const char *expected) {
   2079     UnicodeString result(prefix);
   2080     FieldPosition pos(FieldPosition::DONT_CARE);
   2081     UErrorCode status = U_ZERO_ERROR;
   2082     fmt.formatMeasures(measures, measureCount, result, pos, status);
   2083     if (!assertSuccess("Error formatting", status)) {
   2084         return;
   2085     }
   2086     assertEquals(description, ctou(expected), result);
   2087 }
   2088 
   2089 void MeasureFormatTest::verifyFormat(
   2090         const char *description,
   2091         const MeasureFormat &fmt,
   2092         const ExpectedResult *expectedResults,
   2093         int32_t count) {
   2094     for (int32_t i = 0; i < count; ++i) {
   2095         verifyFormat(description, fmt, expectedResults[i].measures, expectedResults[i].count, expectedResults[i].expected);
   2096     }
   2097 }
   2098 
   2099 extern IntlTest *createMeasureFormatTest() {
   2100     return new MeasureFormatTest();
   2101 }
   2102 
   2103 #endif
   2104 
   2105