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