Imported Upstream version 58.1
[platform/upstream/icu.git] / source / test / intltest / measfmttest.cpp
index 07506a5..510146b 100644 (file)
@@ -1,3 +1,5 @@
+// Copyright (C) 2016 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html
 /*
 *******************************************************************************
 * Copyright (C) 2014-2016, International Business Machines Corporation and    *
@@ -22,6 +24,7 @@
 #include "unicode/tmunit.h"
 #include "unicode/plurrule.h"
 #include "charstr.h"
+#include "cstr.h"
 #include "unicode/reldatefmt.h"
 
 struct ExpectedResult {
@@ -43,6 +46,7 @@ private:
     void TestCompatible55_1();
     void TestCompatible56_1();
     void TestCompatible57_1();
+    void TestCompatible58_1();
     void TestGetAvailable();
     void TestExamplesInDocs();
     void TestFormatPeriodEn();
@@ -56,6 +60,7 @@ private:
     void TestManyLocaleDurations();
     void TestGram();
     void TestCurrencies();
+    void TestDisplayNames();
     void TestFieldPosition();
     void TestFieldPositionMultiple();
     void TestBadArg();
@@ -109,6 +114,11 @@ private:
         const Measure *measures,
         int32_t measureCount,
         const char *expected);
+    void helperTestDisplayName(
+        const MeasureUnit *unit,
+        const char *localeID,
+        UMeasureFormatWidth width,
+        const char *expected);
     void verifyFieldPosition(
         const char *description,
         const MeasureFormat &fmt,
@@ -132,6 +142,7 @@ void MeasureFormatTest::runIndexedTest(
     TESTCASE_AUTO(TestCompatible55_1);
     TESTCASE_AUTO(TestCompatible56_1);
     TESTCASE_AUTO(TestCompatible57_1);
+    TESTCASE_AUTO(TestCompatible58_1);
     TESTCASE_AUTO(TestGetAvailable);
     TESTCASE_AUTO(TestExamplesInDocs);
     TESTCASE_AUTO(TestFormatPeriodEn);
@@ -145,6 +156,7 @@ void MeasureFormatTest::runIndexedTest(
     TESTCASE_AUTO(TestManyLocaleDurations);
     TESTCASE_AUTO(TestGram);
     TESTCASE_AUTO(TestCurrencies);
+    TESTCASE_AUTO(TestDisplayNames);
     TESTCASE_AUTO(TestFieldPosition);
     TESTCASE_AUTO(TestFieldPositionMultiple);
     TESTCASE_AUTO(TestBadArg);
@@ -738,6 +750,150 @@ void MeasureFormatTest::TestCompatible57_1() {
     assertSuccess("", status);
 }
 
+void MeasureFormatTest::TestCompatible58_1() {
+    UErrorCode status = U_ZERO_ERROR;
+    LocalPointer<MeasureUnit> measureUnit;
+    measureUnit.adoptInstead(MeasureUnit::createGForce(status));
+    measureUnit.adoptInstead(MeasureUnit::createMeterPerSecondSquared(status));
+    measureUnit.adoptInstead(MeasureUnit::createArcMinute(status));
+    measureUnit.adoptInstead(MeasureUnit::createArcSecond(status));
+    measureUnit.adoptInstead(MeasureUnit::createDegree(status));
+    measureUnit.adoptInstead(MeasureUnit::createRadian(status));
+    measureUnit.adoptInstead(MeasureUnit::createRevolutionAngle(status));
+    measureUnit.adoptInstead(MeasureUnit::createAcre(status));
+    measureUnit.adoptInstead(MeasureUnit::createHectare(status));
+    measureUnit.adoptInstead(MeasureUnit::createSquareCentimeter(status));
+    measureUnit.adoptInstead(MeasureUnit::createSquareFoot(status));
+    measureUnit.adoptInstead(MeasureUnit::createSquareInch(status));
+    measureUnit.adoptInstead(MeasureUnit::createSquareKilometer(status));
+    measureUnit.adoptInstead(MeasureUnit::createSquareMeter(status));
+    measureUnit.adoptInstead(MeasureUnit::createSquareMile(status));
+    measureUnit.adoptInstead(MeasureUnit::createSquareYard(status));
+    measureUnit.adoptInstead(MeasureUnit::createKarat(status));
+    measureUnit.adoptInstead(MeasureUnit::createMilligramPerDeciliter(status));
+    measureUnit.adoptInstead(MeasureUnit::createMillimolePerLiter(status));
+    measureUnit.adoptInstead(MeasureUnit::createPartPerMillion(status));
+    measureUnit.adoptInstead(MeasureUnit::createLiterPer100Kilometers(status));
+    measureUnit.adoptInstead(MeasureUnit::createLiterPerKilometer(status));
+    measureUnit.adoptInstead(MeasureUnit::createMilePerGallon(status));
+    measureUnit.adoptInstead(MeasureUnit::createMilePerGallonImperial(status));
+    measureUnit.adoptInstead(MeasureUnit::createEast(status));
+    measureUnit.adoptInstead(MeasureUnit::createNorth(status));
+    measureUnit.adoptInstead(MeasureUnit::createSouth(status));
+    measureUnit.adoptInstead(MeasureUnit::createWest(status));
+    measureUnit.adoptInstead(MeasureUnit::createBit(status));
+    measureUnit.adoptInstead(MeasureUnit::createByte(status));
+    measureUnit.adoptInstead(MeasureUnit::createGigabit(status));
+    measureUnit.adoptInstead(MeasureUnit::createGigabyte(status));
+    measureUnit.adoptInstead(MeasureUnit::createKilobit(status));
+    measureUnit.adoptInstead(MeasureUnit::createKilobyte(status));
+    measureUnit.adoptInstead(MeasureUnit::createMegabit(status));
+    measureUnit.adoptInstead(MeasureUnit::createMegabyte(status));
+    measureUnit.adoptInstead(MeasureUnit::createTerabit(status));
+    measureUnit.adoptInstead(MeasureUnit::createTerabyte(status));
+    measureUnit.adoptInstead(MeasureUnit::createCentury(status));
+    measureUnit.adoptInstead(MeasureUnit::createDay(status));
+    measureUnit.adoptInstead(MeasureUnit::createHour(status));
+    measureUnit.adoptInstead(MeasureUnit::createMicrosecond(status));
+    measureUnit.adoptInstead(MeasureUnit::createMillisecond(status));
+    measureUnit.adoptInstead(MeasureUnit::createMinute(status));
+    measureUnit.adoptInstead(MeasureUnit::createMonth(status));
+    measureUnit.adoptInstead(MeasureUnit::createNanosecond(status));
+    measureUnit.adoptInstead(MeasureUnit::createSecond(status));
+    measureUnit.adoptInstead(MeasureUnit::createWeek(status));
+    measureUnit.adoptInstead(MeasureUnit::createYear(status));
+    measureUnit.adoptInstead(MeasureUnit::createAmpere(status));
+    measureUnit.adoptInstead(MeasureUnit::createMilliampere(status));
+    measureUnit.adoptInstead(MeasureUnit::createOhm(status));
+    measureUnit.adoptInstead(MeasureUnit::createVolt(status));
+    measureUnit.adoptInstead(MeasureUnit::createCalorie(status));
+    measureUnit.adoptInstead(MeasureUnit::createFoodcalorie(status));
+    measureUnit.adoptInstead(MeasureUnit::createJoule(status));
+    measureUnit.adoptInstead(MeasureUnit::createKilocalorie(status));
+    measureUnit.adoptInstead(MeasureUnit::createKilojoule(status));
+    measureUnit.adoptInstead(MeasureUnit::createKilowattHour(status));
+    measureUnit.adoptInstead(MeasureUnit::createGigahertz(status));
+    measureUnit.adoptInstead(MeasureUnit::createHertz(status));
+    measureUnit.adoptInstead(MeasureUnit::createKilohertz(status));
+    measureUnit.adoptInstead(MeasureUnit::createMegahertz(status));
+    measureUnit.adoptInstead(MeasureUnit::createAstronomicalUnit(status));
+    measureUnit.adoptInstead(MeasureUnit::createCentimeter(status));
+    measureUnit.adoptInstead(MeasureUnit::createDecimeter(status));
+    measureUnit.adoptInstead(MeasureUnit::createFathom(status));
+    measureUnit.adoptInstead(MeasureUnit::createFoot(status));
+    measureUnit.adoptInstead(MeasureUnit::createFurlong(status));
+    measureUnit.adoptInstead(MeasureUnit::createInch(status));
+    measureUnit.adoptInstead(MeasureUnit::createKilometer(status));
+    measureUnit.adoptInstead(MeasureUnit::createLightYear(status));
+    measureUnit.adoptInstead(MeasureUnit::createMeter(status));
+    measureUnit.adoptInstead(MeasureUnit::createMicrometer(status));
+    measureUnit.adoptInstead(MeasureUnit::createMile(status));
+    measureUnit.adoptInstead(MeasureUnit::createMileScandinavian(status));
+    measureUnit.adoptInstead(MeasureUnit::createMillimeter(status));
+    measureUnit.adoptInstead(MeasureUnit::createNanometer(status));
+    measureUnit.adoptInstead(MeasureUnit::createNauticalMile(status));
+    measureUnit.adoptInstead(MeasureUnit::createParsec(status));
+    measureUnit.adoptInstead(MeasureUnit::createPicometer(status));
+    measureUnit.adoptInstead(MeasureUnit::createYard(status));
+    measureUnit.adoptInstead(MeasureUnit::createLux(status));
+    measureUnit.adoptInstead(MeasureUnit::createCarat(status));
+    measureUnit.adoptInstead(MeasureUnit::createGram(status));
+    measureUnit.adoptInstead(MeasureUnit::createKilogram(status));
+    measureUnit.adoptInstead(MeasureUnit::createMetricTon(status));
+    measureUnit.adoptInstead(MeasureUnit::createMicrogram(status));
+    measureUnit.adoptInstead(MeasureUnit::createMilligram(status));
+    measureUnit.adoptInstead(MeasureUnit::createOunce(status));
+    measureUnit.adoptInstead(MeasureUnit::createOunceTroy(status));
+    measureUnit.adoptInstead(MeasureUnit::createPound(status));
+    measureUnit.adoptInstead(MeasureUnit::createStone(status));
+    measureUnit.adoptInstead(MeasureUnit::createTon(status));
+    measureUnit.adoptInstead(MeasureUnit::createGigawatt(status));
+    measureUnit.adoptInstead(MeasureUnit::createHorsepower(status));
+    measureUnit.adoptInstead(MeasureUnit::createKilowatt(status));
+    measureUnit.adoptInstead(MeasureUnit::createMegawatt(status));
+    measureUnit.adoptInstead(MeasureUnit::createMilliwatt(status));
+    measureUnit.adoptInstead(MeasureUnit::createWatt(status));
+    measureUnit.adoptInstead(MeasureUnit::createHectopascal(status));
+    measureUnit.adoptInstead(MeasureUnit::createInchHg(status));
+    measureUnit.adoptInstead(MeasureUnit::createMillibar(status));
+    measureUnit.adoptInstead(MeasureUnit::createMillimeterOfMercury(status));
+    measureUnit.adoptInstead(MeasureUnit::createPoundPerSquareInch(status));
+    measureUnit.adoptInstead(MeasureUnit::createKilometerPerHour(status));
+    measureUnit.adoptInstead(MeasureUnit::createKnot(status));
+    measureUnit.adoptInstead(MeasureUnit::createMeterPerSecond(status));
+    measureUnit.adoptInstead(MeasureUnit::createMilePerHour(status));
+    measureUnit.adoptInstead(MeasureUnit::createCelsius(status));
+    measureUnit.adoptInstead(MeasureUnit::createFahrenheit(status));
+    measureUnit.adoptInstead(MeasureUnit::createGenericTemperature(status));
+    measureUnit.adoptInstead(MeasureUnit::createKelvin(status));
+    measureUnit.adoptInstead(MeasureUnit::createAcreFoot(status));
+    measureUnit.adoptInstead(MeasureUnit::createBushel(status));
+    measureUnit.adoptInstead(MeasureUnit::createCentiliter(status));
+    measureUnit.adoptInstead(MeasureUnit::createCubicCentimeter(status));
+    measureUnit.adoptInstead(MeasureUnit::createCubicFoot(status));
+    measureUnit.adoptInstead(MeasureUnit::createCubicInch(status));
+    measureUnit.adoptInstead(MeasureUnit::createCubicKilometer(status));
+    measureUnit.adoptInstead(MeasureUnit::createCubicMeter(status));
+    measureUnit.adoptInstead(MeasureUnit::createCubicMile(status));
+    measureUnit.adoptInstead(MeasureUnit::createCubicYard(status));
+    measureUnit.adoptInstead(MeasureUnit::createCup(status));
+    measureUnit.adoptInstead(MeasureUnit::createCupMetric(status));
+    measureUnit.adoptInstead(MeasureUnit::createDeciliter(status));
+    measureUnit.adoptInstead(MeasureUnit::createFluidOunce(status));
+    measureUnit.adoptInstead(MeasureUnit::createGallon(status));
+    measureUnit.adoptInstead(MeasureUnit::createGallonImperial(status));
+    measureUnit.adoptInstead(MeasureUnit::createHectoliter(status));
+    measureUnit.adoptInstead(MeasureUnit::createLiter(status));
+    measureUnit.adoptInstead(MeasureUnit::createMegaliter(status));
+    measureUnit.adoptInstead(MeasureUnit::createMilliliter(status));
+    measureUnit.adoptInstead(MeasureUnit::createPint(status));
+    measureUnit.adoptInstead(MeasureUnit::createPintMetric(status));
+    measureUnit.adoptInstead(MeasureUnit::createQuart(status));
+    measureUnit.adoptInstead(MeasureUnit::createTablespoon(status));
+    measureUnit.adoptInstead(MeasureUnit::createTeaspoon(status));
+    assertSuccess("", status);
+}
+
 void MeasureFormatTest::TestBasic() {
     UErrorCode status = U_ZERO_ERROR;
     MeasureUnit *ptr1 = MeasureUnit::createArcMinute(status);
@@ -843,17 +999,17 @@ void MeasureFormatTest::TestExamplesInDocs() {
     if (!assertSuccess("Error creating formatters", status)) {
         return;
     }
-    Measure measureC(23, MeasureUnit::createCelsius(status), status);
-    Measure measureF(70, MeasureUnit::createFahrenheit(status), status);
+    Measure measureC((double)23, MeasureUnit::createCelsius(status), status);
+    Measure measureF((double)70, MeasureUnit::createFahrenheit(status), status);
     Measure feetAndInches[] = {
-            Measure(70, MeasureUnit::createFoot(status), status),
-            Measure(5.3, MeasureUnit::createInch(status), status)};
+            Measure((double)70, MeasureUnit::createFoot(status), status),
+            Measure((double)5.3, MeasureUnit::createInch(status), status)};
     Measure footAndInch[] = {
-            Measure(1, MeasureUnit::createFoot(status), status),
-            Measure(1, MeasureUnit::createInch(status), status)};
+            Measure((double)1, MeasureUnit::createFoot(status), status),
+            Measure((double)1, MeasureUnit::createInch(status), status)};
     Measure inchAndFeet[] = {
-            Measure(1, MeasureUnit::createInch(status), status),
-            Measure(2, MeasureUnit::createFoot(status), status)};
+            Measure((double)1, MeasureUnit::createInch(status), status),
+            Measure((double)2, MeasureUnit::createFoot(status), status)};
     if (!assertSuccess("Error creating measurements.", status)) {
         return;
     }
@@ -911,28 +1067,28 @@ void MeasureFormatTest::TestExamplesInDocs() {
 
 void MeasureFormatTest::TestFormatPeriodEn() {
     UErrorCode status = U_ZERO_ERROR;
-    Measure t_19m[] = {Measure(19, MeasureUnit::createMinute(status), status)};
+    Measure t_19m[] = {Measure((double)19, MeasureUnit::createMinute(status), status)};
     Measure t_1h_23_5s[] = {
-            Measure(1.0, MeasureUnit::createHour(status), status),
-            Measure(23.5, MeasureUnit::createSecond(status), status)
+            Measure((double)1.0, MeasureUnit::createHour(status), status),
+            Measure((double)23.5, MeasureUnit::createSecond(status), status)
     };
     Measure t_1h_23_5m[] = {
-            Measure(1.0, MeasureUnit::createHour(status), status),
-            Measure(23.5, MeasureUnit::createMinute(status), status)
+            Measure((double)1.0, MeasureUnit::createHour(status), status),
+            Measure((double)23.5, MeasureUnit::createMinute(status), status)
     };
     Measure t_1h_0m_23s[] = {
             Measure(
-                    1.0,
+                    (double)1.0,
                     TimeUnit::createInstance(
                             TimeUnit::UTIMEUNIT_HOUR, status),
                     status),
             Measure(
-                    0.0,
+                    (double)0.0,
                     TimeUnit::createInstance(
                             TimeUnit::UTIMEUNIT_MINUTE, status),
                      status),
             Measure(
-                    23,
+                    (double)23.0,
                     TimeUnit::createInstance(
                             TimeUnit::UTIMEUNIT_SECOND, status),
                     status)
@@ -1033,10 +1189,10 @@ void MeasureFormatTest::TestFormatPeriodEn() {
             {t_3h_5h, UPRV_LENGTHOF(t_3h_5h), "3h 5h"}};
 
     ExpectedResult fullDataDe[] = {
-            {t_1m_59_9996s, UPRV_LENGTHOF(t_1m_59_9996s), "1 Minute und 59,9996 Sekunden"},
+            {t_1m_59_9996s, UPRV_LENGTHOF(t_1m_59_9996s), "1 Minute, 59,9996 Sekunden"},
             {t_19m, UPRV_LENGTHOF(t_19m), "19 Minuten"},
-            {t_1h_23_5s, UPRV_LENGTHOF(t_1h_23_5s), "1 Stunde und 23,5 Sekunden"},
-            {t_1h_23_5m, UPRV_LENGTHOF(t_1h_23_5m), "1 Stunde und 23,5 Minuten"},
+            {t_1h_23_5s, UPRV_LENGTHOF(t_1h_23_5s), "1 Stunde, 23,5 Sekunden"},
+            {t_1h_23_5m, UPRV_LENGTHOF(t_1h_23_5m), "1 Stunde, 23,5 Minuten"},
             {t_1h_0m_23s, UPRV_LENGTHOF(t_1h_0m_23s), "1 Stunde, 0 Minuten und 23 Sekunden"},
             {t_2y_5M_3w_4d, UPRV_LENGTHOF(t_2y_5M_3w_4d), "2 Jahre, 5 Monate, 3 Wochen und 4 Tage"}};
 
@@ -1262,7 +1418,7 @@ void MeasureFormatTest::TestFormatSingleArg() {
         return;
     }
     UnicodeString buffer;
-    FieldPosition pos(0);
+    FieldPosition pos(FieldPosition::DONT_CARE);
     fmt.format(
             new Measure(3.5, MeasureUnit::createFoot(status), status),
             buffer,
@@ -1455,14 +1611,14 @@ void MeasureFormatTest::helperTestMultiples(
         UMeasureFormatWidth width,
         const char *expected) {
     UErrorCode status = U_ZERO_ERROR;
-    FieldPosition pos(0);
+    FieldPosition pos(FieldPosition::DONT_CARE);
     MeasureFormat fmt(locale, width, status);
     if (!assertSuccess("Error creating format object", status)) {
         return;
     }
     Measure measures[] = {
-            Measure(2, MeasureUnit::createMile(status), status),
-            Measure(1, MeasureUnit::createFoot(status), status),
+            Measure(2.0, MeasureUnit::createMile(status), status),
+            Measure(1.0, MeasureUnit::createFoot(status), status),
             Measure(2.3, MeasureUnit::createInch(status), status)};
     if (!assertSuccess("Error creating measures", status)) {
         return;
@@ -1478,8 +1634,8 @@ void MeasureFormatTest::helperTestMultiples(
 void MeasureFormatTest::TestManyLocaleDurations() {
     UErrorCode status = U_ZERO_ERROR;
     Measure measures[] = {
-            Measure(5, MeasureUnit::createHour(status), status),
-            Measure(37, MeasureUnit::createMinute(status), status)};
+            Measure(5.0, MeasureUnit::createHour(status), status),
+            Measure(37.0, MeasureUnit::createMinute(status), status)};
     if (!assertSuccess("Error creating measures", status)) {
         return;
     }
@@ -1497,14 +1653,14 @@ void MeasureFormatTest::TestManyLocaleDurations() {
     helperTestManyLocaleDurations("fr", UMEASFMT_WIDTH_NUMERIC, measures, UPRV_LENGTHOF(measures), "05:37");
     helperTestManyLocaleDurations("is", UMEASFMT_WIDTH_NARROW,  measures, UPRV_LENGTHOF(measures), "5 klst. og 37 m\\u00EDn.");
     helperTestManyLocaleDurations("is", UMEASFMT_WIDTH_NUMERIC, measures, UPRV_LENGTHOF(measures), "5:37");
-    helperTestManyLocaleDurations("ja", UMEASFMT_WIDTH_NARROW,  measures, UPRV_LENGTHOF(measures), "5\\u6642\\u959337\\u5206");
+    helperTestManyLocaleDurations("ja", UMEASFMT_WIDTH_NARROW,  measures, UPRV_LENGTHOF(measures), "5h37m");
     helperTestManyLocaleDurations("ja", UMEASFMT_WIDTH_NUMERIC, measures, UPRV_LENGTHOF(measures), "5:37");
     helperTestManyLocaleDurations("nb", UMEASFMT_WIDTH_NARROW,  measures, UPRV_LENGTHOF(measures), "5t, 37m");
-    helperTestManyLocaleDurations("nb", UMEASFMT_WIDTH_NUMERIC, measures, UPRV_LENGTHOF(measures), "5.37");
+    helperTestManyLocaleDurations("nb", UMEASFMT_WIDTH_NUMERIC, measures, UPRV_LENGTHOF(measures), "5:37");
     helperTestManyLocaleDurations("nl", UMEASFMT_WIDTH_NARROW,  measures, UPRV_LENGTHOF(measures), "5 u, 37 m");
     helperTestManyLocaleDurations("nl", UMEASFMT_WIDTH_NUMERIC, measures, UPRV_LENGTHOF(measures), "5:37");
     helperTestManyLocaleDurations("nn", UMEASFMT_WIDTH_NARROW,  measures, UPRV_LENGTHOF(measures), "5 h og 37 min");
-    helperTestManyLocaleDurations("nn", UMEASFMT_WIDTH_NUMERIC, measures, UPRV_LENGTHOF(measures), "5.37");
+    helperTestManyLocaleDurations("nn", UMEASFMT_WIDTH_NUMERIC, measures, UPRV_LENGTHOF(measures), "5:37");
     helperTestManyLocaleDurations("sv", UMEASFMT_WIDTH_NARROW,  measures, UPRV_LENGTHOF(measures), "5h 37m");
     helperTestManyLocaleDurations("sv", UMEASFMT_WIDTH_NUMERIC, measures, UPRV_LENGTHOF(measures), "5:37");
     helperTestManyLocaleDurations("zh", UMEASFMT_WIDTH_NARROW,  measures, UPRV_LENGTHOF(measures), "5\\u5C0F\\u65F637\\u5206\\u949F");
@@ -1523,7 +1679,7 @@ void MeasureFormatTest::helperTestManyLocaleDurations( const char *localeID,
         return;
     }
     UnicodeString buffer;
-    FieldPosition pos(0);
+    FieldPosition pos(FieldPosition::DONT_CARE);
     fmt.formatMeasures(measures, measureCount, buffer, pos, status);
     if (U_FAILURE(status)) {
         errln("MeasureFormat::formatMeasures failed for locale %s, width %d, status: %s", localeID, (int)width, u_errorName(status));
@@ -1541,8 +1697,8 @@ void MeasureFormatTest::TestGram() {
     if (!assertSuccess("Error creating format object", status)) {
         return;
     }
-    Measure gram(1, MeasureUnit::createGram(status), status);
-    Measure gforce(1, MeasureUnit::createGForce(status), status);
+    Measure gram((double)1, MeasureUnit::createGram(status), status);
+    Measure gforce((double)1, MeasureUnit::createGForce(status), status);
     if (!assertSuccess("Error creating measures", status)) {
         return;
     }
@@ -1551,12 +1707,14 @@ void MeasureFormatTest::TestGram() {
 }
 
 void MeasureFormatTest::TestCurrencies() {
-    UChar USD[] = {'U', 'S', 'D', 0};
+    UChar USD[4];
+    u_uastrcpy(USD, "USD");
     UErrorCode status = U_ZERO_ERROR;
     CurrencyAmount USD_1(1.0, USD, status);
+    assertEquals("Currency Code", USD, USD_1.getISOCurrency());
     CurrencyAmount USD_2(2.0, USD, status);
     CurrencyAmount USD_NEG_1(-1.0, USD, status);
-    if (!assertSuccess("Error creating measures", status)) {
+    if (!assertSuccess("Error creating currencies", status)) {
         return;
     }
     Locale en("en");
@@ -1590,6 +1748,61 @@ void MeasureFormatTest::TestCurrencies() {
     verifyFormat("TestCurrenciesNumeric", fmt, &USD_2, 1, "$2.00");
 }
 
+void MeasureFormatTest::TestDisplayNames() {
+    UErrorCode status = U_ZERO_ERROR;
+    helperTestDisplayName( MeasureUnit::createYear(status), "en", UMEASFMT_WIDTH_WIDE, "years" );
+    helperTestDisplayName( MeasureUnit::createYear(status), "ja", UMEASFMT_WIDTH_WIDE, "\\u5E74" );
+    helperTestDisplayName( MeasureUnit::createYear(status), "es", UMEASFMT_WIDTH_WIDE, "a\\u00F1os" );
+    helperTestDisplayName( MeasureUnit::createYear(status), "pt", UMEASFMT_WIDTH_WIDE, "anos" );
+    helperTestDisplayName( MeasureUnit::createYear(status), "pt-PT", UMEASFMT_WIDTH_WIDE, "anos" );
+    helperTestDisplayName( MeasureUnit::createAmpere(status), "en", UMEASFMT_WIDTH_WIDE, "amperes" );
+    helperTestDisplayName( MeasureUnit::createAmpere(status), "ja", UMEASFMT_WIDTH_WIDE, "\\u30A2\\u30F3\\u30DA\\u30A2" );
+    helperTestDisplayName( MeasureUnit::createAmpere(status), "es", UMEASFMT_WIDTH_WIDE, "amperios" );
+    helperTestDisplayName( MeasureUnit::createAmpere(status), "pt", UMEASFMT_WIDTH_WIDE, "amperes" );
+    helperTestDisplayName( MeasureUnit::createAmpere(status), "pt-PT", UMEASFMT_WIDTH_WIDE, "amperes" );
+    helperTestDisplayName( MeasureUnit::createMeterPerSecondSquared(status), "pt", UMEASFMT_WIDTH_WIDE, "metros por segundo ao quadrado" );
+    helperTestDisplayName( MeasureUnit::createMeterPerSecondSquared(status), "pt-PT", UMEASFMT_WIDTH_WIDE, "metros por segundo quadrado" );
+    helperTestDisplayName( MeasureUnit::createSquareKilometer(status), "pt", UMEASFMT_WIDTH_NARROW, "km\\u00B2" );
+    helperTestDisplayName( MeasureUnit::createSquareKilometer(status), "pt", UMEASFMT_WIDTH_SHORT, "km\\u00B2" );
+    helperTestDisplayName( MeasureUnit::createSquareKilometer(status), "pt", UMEASFMT_WIDTH_WIDE, "quil\\u00F4metros quadrados" );
+    helperTestDisplayName( MeasureUnit::createSecond(status), "pt-PT", UMEASFMT_WIDTH_NARROW, "s" );
+    helperTestDisplayName( MeasureUnit::createSecond(status), "pt-PT", UMEASFMT_WIDTH_SHORT, "s" );
+    helperTestDisplayName( MeasureUnit::createSecond(status), "pt-PT", UMEASFMT_WIDTH_WIDE, "segundos" );
+    helperTestDisplayName( MeasureUnit::createSecond(status), "pt", UMEASFMT_WIDTH_NARROW, "seg" );
+    helperTestDisplayName( MeasureUnit::createSecond(status), "pt", UMEASFMT_WIDTH_SHORT, "segs" );
+    helperTestDisplayName( MeasureUnit::createSecond(status), "pt", UMEASFMT_WIDTH_WIDE, "segundos" );
+    assertSuccess("Error creating measure units", status);
+}
+
+void MeasureFormatTest::helperTestDisplayName(const MeasureUnit *unit,
+                            const char *localeID,
+                            UMeasureFormatWidth width,
+                            const char *expected) {
+    UErrorCode status = U_ZERO_ERROR;
+    MeasureFormat fmt(Locale(localeID), width, status);
+    if (U_FAILURE(status)) {
+        errln("Could not create MeasureFormat for locale %s, width %d, status: %s",
+            localeID, (int)width, u_errorName(status));
+        return;
+    }
+
+    UnicodeString dnam = fmt.getUnitDisplayName(*unit, status);
+    if (U_FAILURE(status)) {
+        errln("MeasureFormat::getUnitDisplayName failed for unit %s-%s, locale %s, width %d, status: %s",
+            unit->getType(), unit->getSubtype(), localeID, (int)width, u_errorName(status));
+        return;
+    }
+
+    UnicodeString expStr(UnicodeString(expected).unescape());
+    if (dnam != expStr) {
+        errln("MeasureFormat::getUnitDisplayName for unit %s-%s, locale %s, width %d: expected \"%s\", got \"%s\"",
+            unit->getType(), unit->getSubtype(), localeID, (int)width, CStr(expStr)(), CStr(dnam)());
+    }
+
+    // Delete the measure unit
+    delete unit;
+}
+
 void MeasureFormatTest::TestFieldPosition() {
     UErrorCode status = U_ZERO_ERROR;
     MeasureFormat fmt("en", UMEASFMT_WIDTH_SHORT, status);
@@ -1610,7 +1823,7 @@ void MeasureFormatTest::TestFieldPosition() {
             NumberFormat::kDecimalSeparatorField,
             10,
             11);
-    measure = Measure(43, MeasureUnit::createFoot(status), status);
+    measure = Measure(43.0, MeasureUnit::createFoot(status), status);
     if (!assertSuccess("Error creating measure object 2", status)) {
         return;
     }
@@ -1632,16 +1845,16 @@ void MeasureFormatTest::TestFieldPositionMultiple() {
         return;
     }
     Measure first[] = {
-            Measure(354, MeasureUnit::createMeter(status), status),
-            Measure(23, MeasureUnit::createCentimeter(status), status)};
+      Measure((double)354, MeasureUnit::createMeter(status), status),
+      Measure((double)23, MeasureUnit::createCentimeter(status), status)};
     Measure second[] = {
-            Measure(354, MeasureUnit::createMeter(status), status),
-            Measure(23, MeasureUnit::createCentimeter(status), status),
-            Measure(5.4, MeasureUnit::createMillimeter(status), status)};
+      Measure((double)354, MeasureUnit::createMeter(status), status),
+      Measure((double)23, MeasureUnit::createCentimeter(status), status),
+      Measure((double)5.4, MeasureUnit::createMillimeter(status), status)};
     Measure third[] = {
-            Measure(3, MeasureUnit::createMeter(status), status),
-            Measure(23, MeasureUnit::createCentimeter(status), status),
-            Measure(5, MeasureUnit::createMillimeter(status), status)};
+      Measure((double)3, MeasureUnit::createMeter(status), status),
+      Measure((double)23, MeasureUnit::createCentimeter(status), status),
+      Measure((double)5, MeasureUnit::createMillimeter(status), status)};
     if (!assertSuccess("Error creating measure objects", status)) {
         return;
     }
@@ -1681,7 +1894,7 @@ void MeasureFormatTest::TestBadArg() {
     if (!assertSuccess("Error creating format object", status)) {
         return;
     }
-    FieldPosition pos(0);
+    FieldPosition pos(FieldPosition::DONT_CARE);
     UnicodeString buffer;
     fmt.format(
             9.3,
@@ -1726,9 +1939,9 @@ void MeasureFormatTest::TestGroupingSeparator() {
     Measure ms[] = {
             Measure((int32_t)INT32_MAX, MeasureUnit::createYear(status), status),
             Measure((int32_t)INT32_MIN, MeasureUnit::createMonth(status), status),
-            Measure(-987, MeasureUnit::createDay(status), status),
-            Measure(1362, MeasureUnit::createHour(status), status),
-            Measure(987, MeasureUnit::createMinute(status), status)};
+            Measure(-987.0, MeasureUnit::createDay(status), status),
+            Measure(1362.0, MeasureUnit::createHour(status), status),
+            Measure(987.0, MeasureUnit::createMinute(status), status)};
     FieldPosition pos(NumberFormat::kGroupingSeparatorField);
     UnicodeString appendTo;
     fmt.formatMeasures(ms, 5, appendTo, pos, status);
@@ -1747,8 +1960,8 @@ void MeasureFormatTest::TestDoubleZero() {
     UErrorCode status = U_ZERO_ERROR;
     Measure measures[] = {
         Measure(4.7, MeasureUnit::createHour(status), status),
-        Measure(23, MeasureUnit::createMinute(status), status),
-        Measure(16, MeasureUnit::createSecond(status), status)};
+        Measure(23.0, MeasureUnit::createMinute(status), status),
+        Measure(16.0, MeasureUnit::createSecond(status), status)};
     Locale en("en");
     NumberFormat *nf = NumberFormat::createInstance(en, status);
     MeasureFormat fmt("en", UMEASFMT_WIDTH_WIDE, nf, status);
@@ -1784,12 +1997,12 @@ void MeasureFormatTest::TestUnitPerUnitResolution() {
     UErrorCode status = U_ZERO_ERROR;
     Locale en("en");
     MeasureFormat fmt("en", UMEASFMT_WIDTH_SHORT, status);
-    Measure measure(50, MeasureUnit::createPound(status), status);
+    Measure measure(50.0, MeasureUnit::createPound(status), status);
     LocalPointer<MeasureUnit> sqInch(MeasureUnit::createSquareInch(status));
     if (!assertSuccess("Create of format unit and per unit", status)) {
         return;
     }
-    FieldPosition pos(0);
+    FieldPosition pos(FieldPosition::DONT_CARE);
     UnicodeString actual;
     fmt.formatMeasurePerUnit(
             measure,
@@ -1807,7 +2020,7 @@ void MeasureFormatTest::TestIndividualPluralFallback() {
     IcuTestErrorCode errorCode(*this, "TestIndividualPluralFallback");
     MeasureFormat mf("fr_CA", UMEASFMT_WIDTH_SHORT, errorCode);
     LocalPointer<Measure> twoDeg(
-        new Measure(2, MeasureUnit::createGenericTemperature(errorCode), errorCode), errorCode);
+        new Measure(2.0, MeasureUnit::createGenericTemperature(errorCode), errorCode), errorCode);
     UnicodeString expected = UNICODE_STRING_SIMPLE("2\\u00B0").unescape();
     UnicodeString actual;
     assertEquals("2 deg temp in fr_CA", expected, mf.format(twoDeg.orphan(), actual, errorCode), TRUE);
@@ -1864,13 +2077,13 @@ void MeasureFormatTest::verifyFormatWithPrefix(
         int32_t measureCount,
         const char *expected) {
     UnicodeString result(prefix);
-    FieldPosition pos(0);
+    FieldPosition pos(FieldPosition::DONT_CARE);
     UErrorCode status = U_ZERO_ERROR;
     fmt.formatMeasures(measures, measureCount, result, pos, status);
     if (!assertSuccess("Error formatting", status)) {
         return;
     }
-    assertEquals(description, UnicodeString(expected).unescape(), result);
+    assertEquals(description, ctou(expected), result);
 }
 
 void MeasureFormatTest::verifyFormat(