• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 #include "unicode/rbnf.h"
32 
33 struct ExpectedResult {
34     const Measure *measures;
35     int32_t count;
36     const char *expected;
37 };
38 
39 class MeasureFormatTest : public IntlTest {
40 public:
MeasureFormatTest()41     MeasureFormatTest() {
42     }
43 
44     void runIndexedTest(int32_t index, UBool exec, const char *&name, char *par=0);
45 private:
46     void TestBasic();
47     void TestCompatible53();
48     void TestCompatible54();
49     void TestCompatible55();
50     void TestCompatible56();
51     void TestCompatible57();
52     void TestCompatible58();
53     void TestCompatible59();
54     void TestCompatible63();
55     void TestCompatible64();
56     void TestCompatible65();
57     void TestGetAvailable();
58     void TestExamplesInDocs();
59     void TestFormatPeriodEn();
60     void Test10219FractionalPlurals();
61     void TestGreek();
62     void TestFormatSingleArg();
63     void TestFormatMeasuresZeroArg();
64     void TestSimplePer();
65     void TestNumeratorPlurals();
66     void TestMultiples();
67     void TestManyLocaleDurations();
68     void TestGram();
69     void TestCurrencies();
70     void TestDisplayNames();
71     void TestFieldPosition();
72     void TestFieldPositionMultiple();
73     void TestBadArg();
74     void TestEquality();
75     void TestGroupingSeparator();
76     void TestDoubleZero();
77     void TestUnitPerUnitResolution();
78     void TestIndividualPluralFallback();
79     void Test20332_PersonUnits();
80     void TestNumericTime();
81     void TestNumericTimeSomeSpecialFormats();
82     void TestIdentifiers();
83     void TestInvalidIdentifiers();
84     void TestCompoundUnitOperations();
85     void TestDimensionlessBehaviour();
86     void Test21060_AddressSanitizerProblem();
87 
88     void verifyFormat(
89         const char *description,
90         const MeasureFormat &fmt,
91         const Measure *measures,
92         int32_t measureCount,
93         const char *expected);
94     void verifyFormatWithPrefix(
95         const char *description,
96         const MeasureFormat &fmt,
97         const UnicodeString &prefix,
98         const Measure *measures,
99         int32_t measureCount,
100         const char *expected);
101     void verifyFormat(
102         const char *description,
103         const MeasureFormat &fmt,
104         const ExpectedResult *expectedResults,
105         int32_t count);
106     void helperTestSimplePer(
107         const Locale &locale,
108         UMeasureFormatWidth width,
109         double value,
110         const MeasureUnit &unit,
111         const MeasureUnit &perUnit,
112         const char *expected);
113     void helperTestSimplePer(
114         const Locale &locale,
115         UMeasureFormatWidth width,
116         double value,
117         const MeasureUnit &unit,
118         const MeasureUnit &perUnit,
119         const char *expected,
120         int32_t field,
121         int32_t expected_start,
122         int32_t expected_end);
123     void helperTestMultiples(
124         const Locale &locale,
125         UMeasureFormatWidth width,
126         const char *expected);
127     void helperTestManyLocaleDurations(
128         const char *localeID,
129         UMeasureFormatWidth width,
130         const Measure *measures,
131         int32_t measureCount,
132         const char *expected);
133     void helperTestDisplayName(
134         const MeasureUnit *unit,
135         const char *localeID,
136         UMeasureFormatWidth width,
137         const char *expected);
138     void verifyFieldPosition(
139         const char *description,
140         const MeasureFormat &fmt,
141         const UnicodeString &prefix,
142         const Measure *measures,
143         int32_t measureCount,
144         NumberFormat::EAlignmentFields field,
145         int32_t start,
146         int32_t end);
147     void verifySingleUnit(
148         const MeasureUnit& unit,
149         UMeasureSIPrefix siPrefix,
150         int8_t power,
151         const char* identifier);
152     void verifyCompoundUnit(
153         const MeasureUnit& unit,
154         const char* identifier,
155         const char** subIdentifiers,
156         int32_t subIdentifierCount);
157     void verifyMixedUnit(
158         const MeasureUnit& unit,
159         const char* identifier,
160         const char** subIdentifiers,
161         int32_t subIdentifierCount);
162 };
163 
runIndexedTest(int32_t index,UBool exec,const char * & name,char *)164 void MeasureFormatTest::runIndexedTest(
165         int32_t index, UBool exec, const char *&name, char *) {
166     if (exec) {
167         logln("TestSuite MeasureFormatTest: ");
168     }
169     TESTCASE_AUTO_BEGIN;
170     TESTCASE_AUTO(TestBasic);
171     TESTCASE_AUTO(TestCompatible53);
172     TESTCASE_AUTO(TestCompatible54);
173     TESTCASE_AUTO(TestCompatible55);
174     TESTCASE_AUTO(TestCompatible56);
175     TESTCASE_AUTO(TestCompatible57);
176     TESTCASE_AUTO(TestCompatible58);
177     TESTCASE_AUTO(TestCompatible59);
178     TESTCASE_AUTO(TestCompatible63);
179     TESTCASE_AUTO(TestCompatible64);
180     TESTCASE_AUTO(TestCompatible65);
181     TESTCASE_AUTO(TestGetAvailable);
182     TESTCASE_AUTO(TestExamplesInDocs);
183     TESTCASE_AUTO(TestFormatPeriodEn);
184     TESTCASE_AUTO(Test10219FractionalPlurals);
185     TESTCASE_AUTO(TestGreek);
186     TESTCASE_AUTO(TestFormatSingleArg);
187     TESTCASE_AUTO(TestFormatMeasuresZeroArg);
188     TESTCASE_AUTO(TestSimplePer);
189     TESTCASE_AUTO(TestNumeratorPlurals);
190     TESTCASE_AUTO(TestMultiples);
191     TESTCASE_AUTO(TestManyLocaleDurations);
192     TESTCASE_AUTO(TestGram);
193     TESTCASE_AUTO(TestCurrencies);
194     TESTCASE_AUTO(TestDisplayNames);
195     TESTCASE_AUTO(TestFieldPosition);
196     TESTCASE_AUTO(TestFieldPositionMultiple);
197     TESTCASE_AUTO(TestBadArg);
198     TESTCASE_AUTO(TestEquality);
199     TESTCASE_AUTO(TestGroupingSeparator);
200     TESTCASE_AUTO(TestDoubleZero);
201     TESTCASE_AUTO(TestUnitPerUnitResolution);
202     TESTCASE_AUTO(TestIndividualPluralFallback);
203     TESTCASE_AUTO(Test20332_PersonUnits);
204     TESTCASE_AUTO(TestNumericTime);
205     TESTCASE_AUTO(TestNumericTimeSomeSpecialFormats);
206     TESTCASE_AUTO(TestIdentifiers);
207     TESTCASE_AUTO(TestInvalidIdentifiers);
208     TESTCASE_AUTO(TestCompoundUnitOperations);
209     TESTCASE_AUTO(TestDimensionlessBehaviour);
210     TESTCASE_AUTO(Test21060_AddressSanitizerProblem);
211     TESTCASE_AUTO_END;
212 }
213 
TestCompatible53()214 void MeasureFormatTest::TestCompatible53() {
215     UErrorCode status = U_ZERO_ERROR;
216     LocalPointer<MeasureUnit> measureUnit;
217     measureUnit.adoptInstead(MeasureUnit::createGForce(status));
218     measureUnit.adoptInstead(MeasureUnit::createArcMinute(status));
219     measureUnit.adoptInstead(MeasureUnit::createArcSecond(status));
220     measureUnit.adoptInstead(MeasureUnit::createDegree(status));
221     measureUnit.adoptInstead(MeasureUnit::createAcre(status));
222     measureUnit.adoptInstead(MeasureUnit::createHectare(status));
223     measureUnit.adoptInstead(MeasureUnit::createSquareFoot(status));
224     measureUnit.adoptInstead(MeasureUnit::createSquareKilometer(status));
225     measureUnit.adoptInstead(MeasureUnit::createSquareMeter(status));
226     measureUnit.adoptInstead(MeasureUnit::createSquareMile(status));
227     measureUnit.adoptInstead(MeasureUnit::createDay(status));
228     measureUnit.adoptInstead(MeasureUnit::createHour(status));
229     measureUnit.adoptInstead(MeasureUnit::createMillisecond(status));
230     measureUnit.adoptInstead(MeasureUnit::createMinute(status));
231     measureUnit.adoptInstead(MeasureUnit::createMonth(status));
232     measureUnit.adoptInstead(MeasureUnit::createSecond(status));
233     measureUnit.adoptInstead(MeasureUnit::createWeek(status));
234     measureUnit.adoptInstead(MeasureUnit::createYear(status));
235     measureUnit.adoptInstead(MeasureUnit::createCentimeter(status));
236     measureUnit.adoptInstead(MeasureUnit::createFoot(status));
237     measureUnit.adoptInstead(MeasureUnit::createInch(status));
238     measureUnit.adoptInstead(MeasureUnit::createKilometer(status));
239     measureUnit.adoptInstead(MeasureUnit::createLightYear(status));
240     measureUnit.adoptInstead(MeasureUnit::createMeter(status));
241     measureUnit.adoptInstead(MeasureUnit::createMile(status));
242     measureUnit.adoptInstead(MeasureUnit::createMillimeter(status));
243     measureUnit.adoptInstead(MeasureUnit::createPicometer(status));
244     measureUnit.adoptInstead(MeasureUnit::createYard(status));
245     measureUnit.adoptInstead(MeasureUnit::createGram(status));
246     measureUnit.adoptInstead(MeasureUnit::createKilogram(status));
247     measureUnit.adoptInstead(MeasureUnit::createOunce(status));
248     measureUnit.adoptInstead(MeasureUnit::createPound(status));
249     measureUnit.adoptInstead(MeasureUnit::createHorsepower(status));
250     measureUnit.adoptInstead(MeasureUnit::createKilowatt(status));
251     measureUnit.adoptInstead(MeasureUnit::createWatt(status));
252     measureUnit.adoptInstead(MeasureUnit::createHectopascal(status));
253     measureUnit.adoptInstead(MeasureUnit::createInchHg(status));
254     measureUnit.adoptInstead(MeasureUnit::createMillibar(status));
255     measureUnit.adoptInstead(MeasureUnit::createKilometerPerHour(status));
256     measureUnit.adoptInstead(MeasureUnit::createMeterPerSecond(status));
257     measureUnit.adoptInstead(MeasureUnit::createMilePerHour(status));
258     measureUnit.adoptInstead(MeasureUnit::createCelsius(status));
259     measureUnit.adoptInstead(MeasureUnit::createFahrenheit(status));
260     measureUnit.adoptInstead(MeasureUnit::createCubicKilometer(status));
261     measureUnit.adoptInstead(MeasureUnit::createCubicMile(status));
262     measureUnit.adoptInstead(MeasureUnit::createLiter(status));
263     assertSuccess("", status);
264 }
265 
TestCompatible54()266 void MeasureFormatTest::TestCompatible54() {
267     UErrorCode status = U_ZERO_ERROR;
268     LocalPointer<MeasureUnit> measureUnit;
269     measureUnit.adoptInstead(MeasureUnit::createGForce(status));
270     measureUnit.adoptInstead(MeasureUnit::createMeterPerSecondSquared(status));
271     measureUnit.adoptInstead(MeasureUnit::createArcMinute(status));
272     measureUnit.adoptInstead(MeasureUnit::createArcSecond(status));
273     measureUnit.adoptInstead(MeasureUnit::createDegree(status));
274     measureUnit.adoptInstead(MeasureUnit::createRadian(status));
275     measureUnit.adoptInstead(MeasureUnit::createAcre(status));
276     measureUnit.adoptInstead(MeasureUnit::createHectare(status));
277     measureUnit.adoptInstead(MeasureUnit::createSquareCentimeter(status));
278     measureUnit.adoptInstead(MeasureUnit::createSquareFoot(status));
279     measureUnit.adoptInstead(MeasureUnit::createSquareInch(status));
280     measureUnit.adoptInstead(MeasureUnit::createSquareKilometer(status));
281     measureUnit.adoptInstead(MeasureUnit::createSquareMeter(status));
282     measureUnit.adoptInstead(MeasureUnit::createSquareMile(status));
283     measureUnit.adoptInstead(MeasureUnit::createSquareYard(status));
284     measureUnit.adoptInstead(MeasureUnit::createLiterPerKilometer(status));
285     measureUnit.adoptInstead(MeasureUnit::createMilePerGallon(status));
286     measureUnit.adoptInstead(MeasureUnit::createBit(status));
287     measureUnit.adoptInstead(MeasureUnit::createByte(status));
288     measureUnit.adoptInstead(MeasureUnit::createGigabit(status));
289     measureUnit.adoptInstead(MeasureUnit::createGigabyte(status));
290     measureUnit.adoptInstead(MeasureUnit::createKilobit(status));
291     measureUnit.adoptInstead(MeasureUnit::createKilobyte(status));
292     measureUnit.adoptInstead(MeasureUnit::createMegabit(status));
293     measureUnit.adoptInstead(MeasureUnit::createMegabyte(status));
294     measureUnit.adoptInstead(MeasureUnit::createTerabit(status));
295     measureUnit.adoptInstead(MeasureUnit::createTerabyte(status));
296     measureUnit.adoptInstead(MeasureUnit::createDay(status));
297     measureUnit.adoptInstead(MeasureUnit::createHour(status));
298     measureUnit.adoptInstead(MeasureUnit::createMicrosecond(status));
299     measureUnit.adoptInstead(MeasureUnit::createMillisecond(status));
300     measureUnit.adoptInstead(MeasureUnit::createMinute(status));
301     measureUnit.adoptInstead(MeasureUnit::createMonth(status));
302     measureUnit.adoptInstead(MeasureUnit::createNanosecond(status));
303     measureUnit.adoptInstead(MeasureUnit::createSecond(status));
304     measureUnit.adoptInstead(MeasureUnit::createWeek(status));
305     measureUnit.adoptInstead(MeasureUnit::createYear(status));
306     measureUnit.adoptInstead(MeasureUnit::createAmpere(status));
307     measureUnit.adoptInstead(MeasureUnit::createMilliampere(status));
308     measureUnit.adoptInstead(MeasureUnit::createOhm(status));
309     measureUnit.adoptInstead(MeasureUnit::createVolt(status));
310     measureUnit.adoptInstead(MeasureUnit::createCalorie(status));
311     measureUnit.adoptInstead(MeasureUnit::createFoodcalorie(status));
312     measureUnit.adoptInstead(MeasureUnit::createJoule(status));
313     measureUnit.adoptInstead(MeasureUnit::createKilocalorie(status));
314     measureUnit.adoptInstead(MeasureUnit::createKilojoule(status));
315     measureUnit.adoptInstead(MeasureUnit::createKilowattHour(status));
316     measureUnit.adoptInstead(MeasureUnit::createGigahertz(status));
317     measureUnit.adoptInstead(MeasureUnit::createHertz(status));
318     measureUnit.adoptInstead(MeasureUnit::createKilohertz(status));
319     measureUnit.adoptInstead(MeasureUnit::createMegahertz(status));
320     measureUnit.adoptInstead(MeasureUnit::createAstronomicalUnit(status));
321     measureUnit.adoptInstead(MeasureUnit::createCentimeter(status));
322     measureUnit.adoptInstead(MeasureUnit::createDecimeter(status));
323     measureUnit.adoptInstead(MeasureUnit::createFathom(status));
324     measureUnit.adoptInstead(MeasureUnit::createFoot(status));
325     measureUnit.adoptInstead(MeasureUnit::createFurlong(status));
326     measureUnit.adoptInstead(MeasureUnit::createInch(status));
327     measureUnit.adoptInstead(MeasureUnit::createKilometer(status));
328     measureUnit.adoptInstead(MeasureUnit::createLightYear(status));
329     measureUnit.adoptInstead(MeasureUnit::createMeter(status));
330     measureUnit.adoptInstead(MeasureUnit::createMicrometer(status));
331     measureUnit.adoptInstead(MeasureUnit::createMile(status));
332     measureUnit.adoptInstead(MeasureUnit::createMillimeter(status));
333     measureUnit.adoptInstead(MeasureUnit::createNanometer(status));
334     measureUnit.adoptInstead(MeasureUnit::createNauticalMile(status));
335     measureUnit.adoptInstead(MeasureUnit::createParsec(status));
336     measureUnit.adoptInstead(MeasureUnit::createPicometer(status));
337     measureUnit.adoptInstead(MeasureUnit::createYard(status));
338     measureUnit.adoptInstead(MeasureUnit::createLux(status));
339     measureUnit.adoptInstead(MeasureUnit::createCarat(status));
340     measureUnit.adoptInstead(MeasureUnit::createGram(status));
341     measureUnit.adoptInstead(MeasureUnit::createKilogram(status));
342     measureUnit.adoptInstead(MeasureUnit::createMetricTon(status));
343     measureUnit.adoptInstead(MeasureUnit::createMicrogram(status));
344     measureUnit.adoptInstead(MeasureUnit::createMilligram(status));
345     measureUnit.adoptInstead(MeasureUnit::createOunce(status));
346     measureUnit.adoptInstead(MeasureUnit::createOunceTroy(status));
347     measureUnit.adoptInstead(MeasureUnit::createPound(status));
348     measureUnit.adoptInstead(MeasureUnit::createStone(status));
349     measureUnit.adoptInstead(MeasureUnit::createTon(status));
350     measureUnit.adoptInstead(MeasureUnit::createGigawatt(status));
351     measureUnit.adoptInstead(MeasureUnit::createHorsepower(status));
352     measureUnit.adoptInstead(MeasureUnit::createKilowatt(status));
353     measureUnit.adoptInstead(MeasureUnit::createMegawatt(status));
354     measureUnit.adoptInstead(MeasureUnit::createMilliwatt(status));
355     measureUnit.adoptInstead(MeasureUnit::createWatt(status));
356     measureUnit.adoptInstead(MeasureUnit::createHectopascal(status));
357     measureUnit.adoptInstead(MeasureUnit::createInchHg(status));
358     measureUnit.adoptInstead(MeasureUnit::createMillibar(status));
359     measureUnit.adoptInstead(MeasureUnit::createMillimeterOfMercury(status));
360     measureUnit.adoptInstead(MeasureUnit::createPoundPerSquareInch(status));
361     measureUnit.adoptInstead(MeasureUnit::createKarat(status));
362     measureUnit.adoptInstead(MeasureUnit::createKilometerPerHour(status));
363     measureUnit.adoptInstead(MeasureUnit::createMeterPerSecond(status));
364     measureUnit.adoptInstead(MeasureUnit::createMilePerHour(status));
365     measureUnit.adoptInstead(MeasureUnit::createCelsius(status));
366     measureUnit.adoptInstead(MeasureUnit::createFahrenheit(status));
367     measureUnit.adoptInstead(MeasureUnit::createKelvin(status));
368     measureUnit.adoptInstead(MeasureUnit::createAcreFoot(status));
369     measureUnit.adoptInstead(MeasureUnit::createBushel(status));
370     measureUnit.adoptInstead(MeasureUnit::createCentiliter(status));
371     measureUnit.adoptInstead(MeasureUnit::createCubicCentimeter(status));
372     measureUnit.adoptInstead(MeasureUnit::createCubicFoot(status));
373     measureUnit.adoptInstead(MeasureUnit::createCubicInch(status));
374     measureUnit.adoptInstead(MeasureUnit::createCubicKilometer(status));
375     measureUnit.adoptInstead(MeasureUnit::createCubicMeter(status));
376     measureUnit.adoptInstead(MeasureUnit::createCubicMile(status));
377     measureUnit.adoptInstead(MeasureUnit::createCubicYard(status));
378     measureUnit.adoptInstead(MeasureUnit::createCup(status));
379     measureUnit.adoptInstead(MeasureUnit::createDeciliter(status));
380     measureUnit.adoptInstead(MeasureUnit::createFluidOunce(status));
381     measureUnit.adoptInstead(MeasureUnit::createGallon(status));
382     measureUnit.adoptInstead(MeasureUnit::createHectoliter(status));
383     measureUnit.adoptInstead(MeasureUnit::createLiter(status));
384     measureUnit.adoptInstead(MeasureUnit::createMegaliter(status));
385     measureUnit.adoptInstead(MeasureUnit::createMilliliter(status));
386     measureUnit.adoptInstead(MeasureUnit::createPint(status));
387     measureUnit.adoptInstead(MeasureUnit::createQuart(status));
388     measureUnit.adoptInstead(MeasureUnit::createTablespoon(status));
389     measureUnit.adoptInstead(MeasureUnit::createTeaspoon(status));
390     assertSuccess("", status);
391 }
392 
TestCompatible55()393 void MeasureFormatTest::TestCompatible55() {
394     UErrorCode status = U_ZERO_ERROR;
395     LocalPointer<MeasureUnit> measureUnit;
396     measureUnit.adoptInstead(MeasureUnit::createGForce(status));
397     measureUnit.adoptInstead(MeasureUnit::createMeterPerSecondSquared(status));
398     measureUnit.adoptInstead(MeasureUnit::createArcMinute(status));
399     measureUnit.adoptInstead(MeasureUnit::createArcSecond(status));
400     measureUnit.adoptInstead(MeasureUnit::createDegree(status));
401     measureUnit.adoptInstead(MeasureUnit::createRadian(status));
402     measureUnit.adoptInstead(MeasureUnit::createAcre(status));
403     measureUnit.adoptInstead(MeasureUnit::createHectare(status));
404     measureUnit.adoptInstead(MeasureUnit::createSquareCentimeter(status));
405     measureUnit.adoptInstead(MeasureUnit::createSquareFoot(status));
406     measureUnit.adoptInstead(MeasureUnit::createSquareInch(status));
407     measureUnit.adoptInstead(MeasureUnit::createSquareKilometer(status));
408     measureUnit.adoptInstead(MeasureUnit::createSquareMeter(status));
409     measureUnit.adoptInstead(MeasureUnit::createSquareMile(status));
410     measureUnit.adoptInstead(MeasureUnit::createSquareYard(status));
411     measureUnit.adoptInstead(MeasureUnit::createLiterPerKilometer(status));
412     measureUnit.adoptInstead(MeasureUnit::createMilePerGallon(status));
413     measureUnit.adoptInstead(MeasureUnit::createBit(status));
414     measureUnit.adoptInstead(MeasureUnit::createByte(status));
415     measureUnit.adoptInstead(MeasureUnit::createGigabit(status));
416     measureUnit.adoptInstead(MeasureUnit::createGigabyte(status));
417     measureUnit.adoptInstead(MeasureUnit::createKilobit(status));
418     measureUnit.adoptInstead(MeasureUnit::createKilobyte(status));
419     measureUnit.adoptInstead(MeasureUnit::createMegabit(status));
420     measureUnit.adoptInstead(MeasureUnit::createMegabyte(status));
421     measureUnit.adoptInstead(MeasureUnit::createTerabit(status));
422     measureUnit.adoptInstead(MeasureUnit::createTerabyte(status));
423     measureUnit.adoptInstead(MeasureUnit::createDay(status));
424     measureUnit.adoptInstead(MeasureUnit::createHour(status));
425     measureUnit.adoptInstead(MeasureUnit::createMicrosecond(status));
426     measureUnit.adoptInstead(MeasureUnit::createMillisecond(status));
427     measureUnit.adoptInstead(MeasureUnit::createMinute(status));
428     measureUnit.adoptInstead(MeasureUnit::createMonth(status));
429     measureUnit.adoptInstead(MeasureUnit::createNanosecond(status));
430     measureUnit.adoptInstead(MeasureUnit::createSecond(status));
431     measureUnit.adoptInstead(MeasureUnit::createWeek(status));
432     measureUnit.adoptInstead(MeasureUnit::createYear(status));
433     measureUnit.adoptInstead(MeasureUnit::createAmpere(status));
434     measureUnit.adoptInstead(MeasureUnit::createMilliampere(status));
435     measureUnit.adoptInstead(MeasureUnit::createOhm(status));
436     measureUnit.adoptInstead(MeasureUnit::createVolt(status));
437     measureUnit.adoptInstead(MeasureUnit::createCalorie(status));
438     measureUnit.adoptInstead(MeasureUnit::createFoodcalorie(status));
439     measureUnit.adoptInstead(MeasureUnit::createJoule(status));
440     measureUnit.adoptInstead(MeasureUnit::createKilocalorie(status));
441     measureUnit.adoptInstead(MeasureUnit::createKilojoule(status));
442     measureUnit.adoptInstead(MeasureUnit::createKilowattHour(status));
443     measureUnit.adoptInstead(MeasureUnit::createGigahertz(status));
444     measureUnit.adoptInstead(MeasureUnit::createHertz(status));
445     measureUnit.adoptInstead(MeasureUnit::createKilohertz(status));
446     measureUnit.adoptInstead(MeasureUnit::createMegahertz(status));
447     measureUnit.adoptInstead(MeasureUnit::createAstronomicalUnit(status));
448     measureUnit.adoptInstead(MeasureUnit::createCentimeter(status));
449     measureUnit.adoptInstead(MeasureUnit::createDecimeter(status));
450     measureUnit.adoptInstead(MeasureUnit::createFathom(status));
451     measureUnit.adoptInstead(MeasureUnit::createFoot(status));
452     measureUnit.adoptInstead(MeasureUnit::createFurlong(status));
453     measureUnit.adoptInstead(MeasureUnit::createInch(status));
454     measureUnit.adoptInstead(MeasureUnit::createKilometer(status));
455     measureUnit.adoptInstead(MeasureUnit::createLightYear(status));
456     measureUnit.adoptInstead(MeasureUnit::createMeter(status));
457     measureUnit.adoptInstead(MeasureUnit::createMicrometer(status));
458     measureUnit.adoptInstead(MeasureUnit::createMile(status));
459     measureUnit.adoptInstead(MeasureUnit::createMillimeter(status));
460     measureUnit.adoptInstead(MeasureUnit::createNanometer(status));
461     measureUnit.adoptInstead(MeasureUnit::createNauticalMile(status));
462     measureUnit.adoptInstead(MeasureUnit::createParsec(status));
463     measureUnit.adoptInstead(MeasureUnit::createPicometer(status));
464     measureUnit.adoptInstead(MeasureUnit::createYard(status));
465     measureUnit.adoptInstead(MeasureUnit::createLux(status));
466     measureUnit.adoptInstead(MeasureUnit::createCarat(status));
467     measureUnit.adoptInstead(MeasureUnit::createGram(status));
468     measureUnit.adoptInstead(MeasureUnit::createKilogram(status));
469     measureUnit.adoptInstead(MeasureUnit::createMetricTon(status));
470     measureUnit.adoptInstead(MeasureUnit::createMicrogram(status));
471     measureUnit.adoptInstead(MeasureUnit::createMilligram(status));
472     measureUnit.adoptInstead(MeasureUnit::createOunce(status));
473     measureUnit.adoptInstead(MeasureUnit::createOunceTroy(status));
474     measureUnit.adoptInstead(MeasureUnit::createPound(status));
475     measureUnit.adoptInstead(MeasureUnit::createStone(status));
476     measureUnit.adoptInstead(MeasureUnit::createTon(status));
477     measureUnit.adoptInstead(MeasureUnit::createGigawatt(status));
478     measureUnit.adoptInstead(MeasureUnit::createHorsepower(status));
479     measureUnit.adoptInstead(MeasureUnit::createKilowatt(status));
480     measureUnit.adoptInstead(MeasureUnit::createMegawatt(status));
481     measureUnit.adoptInstead(MeasureUnit::createMilliwatt(status));
482     measureUnit.adoptInstead(MeasureUnit::createWatt(status));
483     measureUnit.adoptInstead(MeasureUnit::createHectopascal(status));
484     measureUnit.adoptInstead(MeasureUnit::createInchHg(status));
485     measureUnit.adoptInstead(MeasureUnit::createMillibar(status));
486     measureUnit.adoptInstead(MeasureUnit::createMillimeterOfMercury(status));
487     measureUnit.adoptInstead(MeasureUnit::createPoundPerSquareInch(status));
488     measureUnit.adoptInstead(MeasureUnit::createKarat(status));
489     measureUnit.adoptInstead(MeasureUnit::createKilometerPerHour(status));
490     measureUnit.adoptInstead(MeasureUnit::createMeterPerSecond(status));
491     measureUnit.adoptInstead(MeasureUnit::createMilePerHour(status));
492     measureUnit.adoptInstead(MeasureUnit::createCelsius(status));
493     measureUnit.adoptInstead(MeasureUnit::createFahrenheit(status));
494     measureUnit.adoptInstead(MeasureUnit::createGenericTemperature(status));
495     measureUnit.adoptInstead(MeasureUnit::createKelvin(status));
496     measureUnit.adoptInstead(MeasureUnit::createAcreFoot(status));
497     measureUnit.adoptInstead(MeasureUnit::createBushel(status));
498     measureUnit.adoptInstead(MeasureUnit::createCentiliter(status));
499     measureUnit.adoptInstead(MeasureUnit::createCubicCentimeter(status));
500     measureUnit.adoptInstead(MeasureUnit::createCubicFoot(status));
501     measureUnit.adoptInstead(MeasureUnit::createCubicInch(status));
502     measureUnit.adoptInstead(MeasureUnit::createCubicKilometer(status));
503     measureUnit.adoptInstead(MeasureUnit::createCubicMeter(status));
504     measureUnit.adoptInstead(MeasureUnit::createCubicMile(status));
505     measureUnit.adoptInstead(MeasureUnit::createCubicYard(status));
506     measureUnit.adoptInstead(MeasureUnit::createCup(status));
507     measureUnit.adoptInstead(MeasureUnit::createDeciliter(status));
508     measureUnit.adoptInstead(MeasureUnit::createFluidOunce(status));
509     measureUnit.adoptInstead(MeasureUnit::createGallon(status));
510     measureUnit.adoptInstead(MeasureUnit::createHectoliter(status));
511     measureUnit.adoptInstead(MeasureUnit::createLiter(status));
512     measureUnit.adoptInstead(MeasureUnit::createMegaliter(status));
513     measureUnit.adoptInstead(MeasureUnit::createMilliliter(status));
514     measureUnit.adoptInstead(MeasureUnit::createPint(status));
515     measureUnit.adoptInstead(MeasureUnit::createQuart(status));
516     measureUnit.adoptInstead(MeasureUnit::createTablespoon(status));
517     measureUnit.adoptInstead(MeasureUnit::createTeaspoon(status));
518     assertSuccess("", status);
519 }
520 
TestCompatible56()521 void MeasureFormatTest::TestCompatible56() {
522     UErrorCode status = U_ZERO_ERROR;
523     LocalPointer<MeasureUnit> measureUnit;
524     measureUnit.adoptInstead(MeasureUnit::createGForce(status));
525     measureUnit.adoptInstead(MeasureUnit::createMeterPerSecondSquared(status));
526     measureUnit.adoptInstead(MeasureUnit::createArcMinute(status));
527     measureUnit.adoptInstead(MeasureUnit::createArcSecond(status));
528     measureUnit.adoptInstead(MeasureUnit::createDegree(status));
529     measureUnit.adoptInstead(MeasureUnit::createRadian(status));
530     measureUnit.adoptInstead(MeasureUnit::createRevolutionAngle(status));
531     measureUnit.adoptInstead(MeasureUnit::createAcre(status));
532     measureUnit.adoptInstead(MeasureUnit::createHectare(status));
533     measureUnit.adoptInstead(MeasureUnit::createSquareCentimeter(status));
534     measureUnit.adoptInstead(MeasureUnit::createSquareFoot(status));
535     measureUnit.adoptInstead(MeasureUnit::createSquareInch(status));
536     measureUnit.adoptInstead(MeasureUnit::createSquareKilometer(status));
537     measureUnit.adoptInstead(MeasureUnit::createSquareMeter(status));
538     measureUnit.adoptInstead(MeasureUnit::createSquareMile(status));
539     measureUnit.adoptInstead(MeasureUnit::createSquareYard(status));
540     measureUnit.adoptInstead(MeasureUnit::createLiterPer100Kilometers(status));
541     measureUnit.adoptInstead(MeasureUnit::createLiterPerKilometer(status));
542     measureUnit.adoptInstead(MeasureUnit::createMilePerGallon(status));
543     measureUnit.adoptInstead(MeasureUnit::createBit(status));
544     measureUnit.adoptInstead(MeasureUnit::createByte(status));
545     measureUnit.adoptInstead(MeasureUnit::createGigabit(status));
546     measureUnit.adoptInstead(MeasureUnit::createGigabyte(status));
547     measureUnit.adoptInstead(MeasureUnit::createKilobit(status));
548     measureUnit.adoptInstead(MeasureUnit::createKilobyte(status));
549     measureUnit.adoptInstead(MeasureUnit::createMegabit(status));
550     measureUnit.adoptInstead(MeasureUnit::createMegabyte(status));
551     measureUnit.adoptInstead(MeasureUnit::createTerabit(status));
552     measureUnit.adoptInstead(MeasureUnit::createTerabyte(status));
553     measureUnit.adoptInstead(MeasureUnit::createCentury(status));
554     measureUnit.adoptInstead(MeasureUnit::createDay(status));
555     measureUnit.adoptInstead(MeasureUnit::createHour(status));
556     measureUnit.adoptInstead(MeasureUnit::createMicrosecond(status));
557     measureUnit.adoptInstead(MeasureUnit::createMillisecond(status));
558     measureUnit.adoptInstead(MeasureUnit::createMinute(status));
559     measureUnit.adoptInstead(MeasureUnit::createMonth(status));
560     measureUnit.adoptInstead(MeasureUnit::createNanosecond(status));
561     measureUnit.adoptInstead(MeasureUnit::createSecond(status));
562     measureUnit.adoptInstead(MeasureUnit::createWeek(status));
563     measureUnit.adoptInstead(MeasureUnit::createYear(status));
564     measureUnit.adoptInstead(MeasureUnit::createAmpere(status));
565     measureUnit.adoptInstead(MeasureUnit::createMilliampere(status));
566     measureUnit.adoptInstead(MeasureUnit::createOhm(status));
567     measureUnit.adoptInstead(MeasureUnit::createVolt(status));
568     measureUnit.adoptInstead(MeasureUnit::createCalorie(status));
569     measureUnit.adoptInstead(MeasureUnit::createFoodcalorie(status));
570     measureUnit.adoptInstead(MeasureUnit::createJoule(status));
571     measureUnit.adoptInstead(MeasureUnit::createKilocalorie(status));
572     measureUnit.adoptInstead(MeasureUnit::createKilojoule(status));
573     measureUnit.adoptInstead(MeasureUnit::createKilowattHour(status));
574     measureUnit.adoptInstead(MeasureUnit::createGigahertz(status));
575     measureUnit.adoptInstead(MeasureUnit::createHertz(status));
576     measureUnit.adoptInstead(MeasureUnit::createKilohertz(status));
577     measureUnit.adoptInstead(MeasureUnit::createMegahertz(status));
578     measureUnit.adoptInstead(MeasureUnit::createAstronomicalUnit(status));
579     measureUnit.adoptInstead(MeasureUnit::createCentimeter(status));
580     measureUnit.adoptInstead(MeasureUnit::createDecimeter(status));
581     measureUnit.adoptInstead(MeasureUnit::createFathom(status));
582     measureUnit.adoptInstead(MeasureUnit::createFoot(status));
583     measureUnit.adoptInstead(MeasureUnit::createFurlong(status));
584     measureUnit.adoptInstead(MeasureUnit::createInch(status));
585     measureUnit.adoptInstead(MeasureUnit::createKilometer(status));
586     measureUnit.adoptInstead(MeasureUnit::createLightYear(status));
587     measureUnit.adoptInstead(MeasureUnit::createMeter(status));
588     measureUnit.adoptInstead(MeasureUnit::createMicrometer(status));
589     measureUnit.adoptInstead(MeasureUnit::createMile(status));
590     measureUnit.adoptInstead(MeasureUnit::createMileScandinavian(status));
591     measureUnit.adoptInstead(MeasureUnit::createMillimeter(status));
592     measureUnit.adoptInstead(MeasureUnit::createNanometer(status));
593     measureUnit.adoptInstead(MeasureUnit::createNauticalMile(status));
594     measureUnit.adoptInstead(MeasureUnit::createParsec(status));
595     measureUnit.adoptInstead(MeasureUnit::createPicometer(status));
596     measureUnit.adoptInstead(MeasureUnit::createYard(status));
597     measureUnit.adoptInstead(MeasureUnit::createLux(status));
598     measureUnit.adoptInstead(MeasureUnit::createCarat(status));
599     measureUnit.adoptInstead(MeasureUnit::createGram(status));
600     measureUnit.adoptInstead(MeasureUnit::createKilogram(status));
601     measureUnit.adoptInstead(MeasureUnit::createMetricTon(status));
602     measureUnit.adoptInstead(MeasureUnit::createMicrogram(status));
603     measureUnit.adoptInstead(MeasureUnit::createMilligram(status));
604     measureUnit.adoptInstead(MeasureUnit::createOunce(status));
605     measureUnit.adoptInstead(MeasureUnit::createOunceTroy(status));
606     measureUnit.adoptInstead(MeasureUnit::createPound(status));
607     measureUnit.adoptInstead(MeasureUnit::createStone(status));
608     measureUnit.adoptInstead(MeasureUnit::createTon(status));
609     measureUnit.adoptInstead(MeasureUnit::createGigawatt(status));
610     measureUnit.adoptInstead(MeasureUnit::createHorsepower(status));
611     measureUnit.adoptInstead(MeasureUnit::createKilowatt(status));
612     measureUnit.adoptInstead(MeasureUnit::createMegawatt(status));
613     measureUnit.adoptInstead(MeasureUnit::createMilliwatt(status));
614     measureUnit.adoptInstead(MeasureUnit::createWatt(status));
615     measureUnit.adoptInstead(MeasureUnit::createHectopascal(status));
616     measureUnit.adoptInstead(MeasureUnit::createInchHg(status));
617     measureUnit.adoptInstead(MeasureUnit::createMillibar(status));
618     measureUnit.adoptInstead(MeasureUnit::createMillimeterOfMercury(status));
619     measureUnit.adoptInstead(MeasureUnit::createPoundPerSquareInch(status));
620     measureUnit.adoptInstead(MeasureUnit::createKarat(status));
621     measureUnit.adoptInstead(MeasureUnit::createKilometerPerHour(status));
622     measureUnit.adoptInstead(MeasureUnit::createKnot(status));
623     measureUnit.adoptInstead(MeasureUnit::createMeterPerSecond(status));
624     measureUnit.adoptInstead(MeasureUnit::createMilePerHour(status));
625     measureUnit.adoptInstead(MeasureUnit::createCelsius(status));
626     measureUnit.adoptInstead(MeasureUnit::createFahrenheit(status));
627     measureUnit.adoptInstead(MeasureUnit::createGenericTemperature(status));
628     measureUnit.adoptInstead(MeasureUnit::createKelvin(status));
629     measureUnit.adoptInstead(MeasureUnit::createAcreFoot(status));
630     measureUnit.adoptInstead(MeasureUnit::createBushel(status));
631     measureUnit.adoptInstead(MeasureUnit::createCentiliter(status));
632     measureUnit.adoptInstead(MeasureUnit::createCubicCentimeter(status));
633     measureUnit.adoptInstead(MeasureUnit::createCubicFoot(status));
634     measureUnit.adoptInstead(MeasureUnit::createCubicInch(status));
635     measureUnit.adoptInstead(MeasureUnit::createCubicKilometer(status));
636     measureUnit.adoptInstead(MeasureUnit::createCubicMeter(status));
637     measureUnit.adoptInstead(MeasureUnit::createCubicMile(status));
638     measureUnit.adoptInstead(MeasureUnit::createCubicYard(status));
639     measureUnit.adoptInstead(MeasureUnit::createCup(status));
640     measureUnit.adoptInstead(MeasureUnit::createCupMetric(status));
641     measureUnit.adoptInstead(MeasureUnit::createDeciliter(status));
642     measureUnit.adoptInstead(MeasureUnit::createFluidOunce(status));
643     measureUnit.adoptInstead(MeasureUnit::createGallon(status));
644     measureUnit.adoptInstead(MeasureUnit::createHectoliter(status));
645     measureUnit.adoptInstead(MeasureUnit::createLiter(status));
646     measureUnit.adoptInstead(MeasureUnit::createMegaliter(status));
647     measureUnit.adoptInstead(MeasureUnit::createMilliliter(status));
648     measureUnit.adoptInstead(MeasureUnit::createPint(status));
649     measureUnit.adoptInstead(MeasureUnit::createPintMetric(status));
650     measureUnit.adoptInstead(MeasureUnit::createQuart(status));
651     measureUnit.adoptInstead(MeasureUnit::createTablespoon(status));
652     measureUnit.adoptInstead(MeasureUnit::createTeaspoon(status));
653     assertSuccess("", status);
654 }
655 
TestCompatible57()656 void MeasureFormatTest::TestCompatible57() {
657     UErrorCode status = U_ZERO_ERROR;
658     LocalPointer<MeasureUnit> measureUnit;
659     measureUnit.adoptInstead(MeasureUnit::createGForce(status));
660     measureUnit.adoptInstead(MeasureUnit::createMeterPerSecondSquared(status));
661     measureUnit.adoptInstead(MeasureUnit::createArcMinute(status));
662     measureUnit.adoptInstead(MeasureUnit::createArcSecond(status));
663     measureUnit.adoptInstead(MeasureUnit::createDegree(status));
664     measureUnit.adoptInstead(MeasureUnit::createRadian(status));
665     measureUnit.adoptInstead(MeasureUnit::createRevolutionAngle(status));
666     measureUnit.adoptInstead(MeasureUnit::createAcre(status));
667     measureUnit.adoptInstead(MeasureUnit::createHectare(status));
668     measureUnit.adoptInstead(MeasureUnit::createSquareCentimeter(status));
669     measureUnit.adoptInstead(MeasureUnit::createSquareFoot(status));
670     measureUnit.adoptInstead(MeasureUnit::createSquareInch(status));
671     measureUnit.adoptInstead(MeasureUnit::createSquareKilometer(status));
672     measureUnit.adoptInstead(MeasureUnit::createSquareMeter(status));
673     measureUnit.adoptInstead(MeasureUnit::createSquareMile(status));
674     measureUnit.adoptInstead(MeasureUnit::createSquareYard(status));
675     measureUnit.adoptInstead(MeasureUnit::createKarat(status));
676     measureUnit.adoptInstead(MeasureUnit::createMilligramPerDeciliter(status));
677     measureUnit.adoptInstead(MeasureUnit::createMillimolePerLiter(status));
678     measureUnit.adoptInstead(MeasureUnit::createPartPerMillion(status));
679     measureUnit.adoptInstead(MeasureUnit::createLiterPer100Kilometers(status));
680     measureUnit.adoptInstead(MeasureUnit::createLiterPerKilometer(status));
681     measureUnit.adoptInstead(MeasureUnit::createMilePerGallon(status));
682     measureUnit.adoptInstead(MeasureUnit::createMilePerGallonImperial(status));
683     measureUnit.adoptInstead(MeasureUnit::createBit(status));
684     measureUnit.adoptInstead(MeasureUnit::createByte(status));
685     measureUnit.adoptInstead(MeasureUnit::createGigabit(status));
686     measureUnit.adoptInstead(MeasureUnit::createGigabyte(status));
687     measureUnit.adoptInstead(MeasureUnit::createKilobit(status));
688     measureUnit.adoptInstead(MeasureUnit::createKilobyte(status));
689     measureUnit.adoptInstead(MeasureUnit::createMegabit(status));
690     measureUnit.adoptInstead(MeasureUnit::createMegabyte(status));
691     measureUnit.adoptInstead(MeasureUnit::createTerabit(status));
692     measureUnit.adoptInstead(MeasureUnit::createTerabyte(status));
693     measureUnit.adoptInstead(MeasureUnit::createCentury(status));
694     measureUnit.adoptInstead(MeasureUnit::createDay(status));
695     measureUnit.adoptInstead(MeasureUnit::createHour(status));
696     measureUnit.adoptInstead(MeasureUnit::createMicrosecond(status));
697     measureUnit.adoptInstead(MeasureUnit::createMillisecond(status));
698     measureUnit.adoptInstead(MeasureUnit::createMinute(status));
699     measureUnit.adoptInstead(MeasureUnit::createMonth(status));
700     measureUnit.adoptInstead(MeasureUnit::createNanosecond(status));
701     measureUnit.adoptInstead(MeasureUnit::createSecond(status));
702     measureUnit.adoptInstead(MeasureUnit::createWeek(status));
703     measureUnit.adoptInstead(MeasureUnit::createYear(status));
704     measureUnit.adoptInstead(MeasureUnit::createAmpere(status));
705     measureUnit.adoptInstead(MeasureUnit::createMilliampere(status));
706     measureUnit.adoptInstead(MeasureUnit::createOhm(status));
707     measureUnit.adoptInstead(MeasureUnit::createVolt(status));
708     measureUnit.adoptInstead(MeasureUnit::createCalorie(status));
709     measureUnit.adoptInstead(MeasureUnit::createFoodcalorie(status));
710     measureUnit.adoptInstead(MeasureUnit::createJoule(status));
711     measureUnit.adoptInstead(MeasureUnit::createKilocalorie(status));
712     measureUnit.adoptInstead(MeasureUnit::createKilojoule(status));
713     measureUnit.adoptInstead(MeasureUnit::createKilowattHour(status));
714     measureUnit.adoptInstead(MeasureUnit::createGigahertz(status));
715     measureUnit.adoptInstead(MeasureUnit::createHertz(status));
716     measureUnit.adoptInstead(MeasureUnit::createKilohertz(status));
717     measureUnit.adoptInstead(MeasureUnit::createMegahertz(status));
718     measureUnit.adoptInstead(MeasureUnit::createAstronomicalUnit(status));
719     measureUnit.adoptInstead(MeasureUnit::createCentimeter(status));
720     measureUnit.adoptInstead(MeasureUnit::createDecimeter(status));
721     measureUnit.adoptInstead(MeasureUnit::createFathom(status));
722     measureUnit.adoptInstead(MeasureUnit::createFoot(status));
723     measureUnit.adoptInstead(MeasureUnit::createFurlong(status));
724     measureUnit.adoptInstead(MeasureUnit::createInch(status));
725     measureUnit.adoptInstead(MeasureUnit::createKilometer(status));
726     measureUnit.adoptInstead(MeasureUnit::createLightYear(status));
727     measureUnit.adoptInstead(MeasureUnit::createMeter(status));
728     measureUnit.adoptInstead(MeasureUnit::createMicrometer(status));
729     measureUnit.adoptInstead(MeasureUnit::createMile(status));
730     measureUnit.adoptInstead(MeasureUnit::createMileScandinavian(status));
731     measureUnit.adoptInstead(MeasureUnit::createMillimeter(status));
732     measureUnit.adoptInstead(MeasureUnit::createNanometer(status));
733     measureUnit.adoptInstead(MeasureUnit::createNauticalMile(status));
734     measureUnit.adoptInstead(MeasureUnit::createParsec(status));
735     measureUnit.adoptInstead(MeasureUnit::createPicometer(status));
736     measureUnit.adoptInstead(MeasureUnit::createYard(status));
737     measureUnit.adoptInstead(MeasureUnit::createLux(status));
738     measureUnit.adoptInstead(MeasureUnit::createCarat(status));
739     measureUnit.adoptInstead(MeasureUnit::createGram(status));
740     measureUnit.adoptInstead(MeasureUnit::createKilogram(status));
741     measureUnit.adoptInstead(MeasureUnit::createMetricTon(status));
742     measureUnit.adoptInstead(MeasureUnit::createMicrogram(status));
743     measureUnit.adoptInstead(MeasureUnit::createMilligram(status));
744     measureUnit.adoptInstead(MeasureUnit::createOunce(status));
745     measureUnit.adoptInstead(MeasureUnit::createOunceTroy(status));
746     measureUnit.adoptInstead(MeasureUnit::createPound(status));
747     measureUnit.adoptInstead(MeasureUnit::createStone(status));
748     measureUnit.adoptInstead(MeasureUnit::createTon(status));
749     measureUnit.adoptInstead(MeasureUnit::createGigawatt(status));
750     measureUnit.adoptInstead(MeasureUnit::createHorsepower(status));
751     measureUnit.adoptInstead(MeasureUnit::createKilowatt(status));
752     measureUnit.adoptInstead(MeasureUnit::createMegawatt(status));
753     measureUnit.adoptInstead(MeasureUnit::createMilliwatt(status));
754     measureUnit.adoptInstead(MeasureUnit::createWatt(status));
755     measureUnit.adoptInstead(MeasureUnit::createHectopascal(status));
756     measureUnit.adoptInstead(MeasureUnit::createInchHg(status));
757     measureUnit.adoptInstead(MeasureUnit::createMillibar(status));
758     measureUnit.adoptInstead(MeasureUnit::createMillimeterOfMercury(status));
759     measureUnit.adoptInstead(MeasureUnit::createPoundPerSquareInch(status));
760     measureUnit.adoptInstead(MeasureUnit::createKilometerPerHour(status));
761     measureUnit.adoptInstead(MeasureUnit::createKnot(status));
762     measureUnit.adoptInstead(MeasureUnit::createMeterPerSecond(status));
763     measureUnit.adoptInstead(MeasureUnit::createMilePerHour(status));
764     measureUnit.adoptInstead(MeasureUnit::createCelsius(status));
765     measureUnit.adoptInstead(MeasureUnit::createFahrenheit(status));
766     measureUnit.adoptInstead(MeasureUnit::createGenericTemperature(status));
767     measureUnit.adoptInstead(MeasureUnit::createKelvin(status));
768     measureUnit.adoptInstead(MeasureUnit::createAcreFoot(status));
769     measureUnit.adoptInstead(MeasureUnit::createBushel(status));
770     measureUnit.adoptInstead(MeasureUnit::createCentiliter(status));
771     measureUnit.adoptInstead(MeasureUnit::createCubicCentimeter(status));
772     measureUnit.adoptInstead(MeasureUnit::createCubicFoot(status));
773     measureUnit.adoptInstead(MeasureUnit::createCubicInch(status));
774     measureUnit.adoptInstead(MeasureUnit::createCubicKilometer(status));
775     measureUnit.adoptInstead(MeasureUnit::createCubicMeter(status));
776     measureUnit.adoptInstead(MeasureUnit::createCubicMile(status));
777     measureUnit.adoptInstead(MeasureUnit::createCubicYard(status));
778     measureUnit.adoptInstead(MeasureUnit::createCup(status));
779     measureUnit.adoptInstead(MeasureUnit::createCupMetric(status));
780     measureUnit.adoptInstead(MeasureUnit::createDeciliter(status));
781     measureUnit.adoptInstead(MeasureUnit::createFluidOunce(status));
782     measureUnit.adoptInstead(MeasureUnit::createGallon(status));
783     measureUnit.adoptInstead(MeasureUnit::createGallonImperial(status));
784     measureUnit.adoptInstead(MeasureUnit::createHectoliter(status));
785     measureUnit.adoptInstead(MeasureUnit::createLiter(status));
786     measureUnit.adoptInstead(MeasureUnit::createMegaliter(status));
787     measureUnit.adoptInstead(MeasureUnit::createMilliliter(status));
788     measureUnit.adoptInstead(MeasureUnit::createPint(status));
789     measureUnit.adoptInstead(MeasureUnit::createPintMetric(status));
790     measureUnit.adoptInstead(MeasureUnit::createQuart(status));
791     measureUnit.adoptInstead(MeasureUnit::createTablespoon(status));
792     measureUnit.adoptInstead(MeasureUnit::createTeaspoon(status));
793     assertSuccess("", status);
794 }
795 
TestCompatible58()796 void MeasureFormatTest::TestCompatible58() {
797     UErrorCode status = U_ZERO_ERROR;
798     LocalPointer<MeasureUnit> measureUnit;
799     measureUnit.adoptInstead(MeasureUnit::createGForce(status));
800     measureUnit.adoptInstead(MeasureUnit::createMeterPerSecondSquared(status));
801     measureUnit.adoptInstead(MeasureUnit::createArcMinute(status));
802     measureUnit.adoptInstead(MeasureUnit::createArcSecond(status));
803     measureUnit.adoptInstead(MeasureUnit::createDegree(status));
804     measureUnit.adoptInstead(MeasureUnit::createRadian(status));
805     measureUnit.adoptInstead(MeasureUnit::createRevolutionAngle(status));
806     measureUnit.adoptInstead(MeasureUnit::createAcre(status));
807     measureUnit.adoptInstead(MeasureUnit::createHectare(status));
808     measureUnit.adoptInstead(MeasureUnit::createSquareCentimeter(status));
809     measureUnit.adoptInstead(MeasureUnit::createSquareFoot(status));
810     measureUnit.adoptInstead(MeasureUnit::createSquareInch(status));
811     measureUnit.adoptInstead(MeasureUnit::createSquareKilometer(status));
812     measureUnit.adoptInstead(MeasureUnit::createSquareMeter(status));
813     measureUnit.adoptInstead(MeasureUnit::createSquareMile(status));
814     measureUnit.adoptInstead(MeasureUnit::createSquareYard(status));
815     measureUnit.adoptInstead(MeasureUnit::createKarat(status));
816     measureUnit.adoptInstead(MeasureUnit::createMilligramPerDeciliter(status));
817     measureUnit.adoptInstead(MeasureUnit::createMillimolePerLiter(status));
818     measureUnit.adoptInstead(MeasureUnit::createPartPerMillion(status));
819     measureUnit.adoptInstead(MeasureUnit::createLiterPer100Kilometers(status));
820     measureUnit.adoptInstead(MeasureUnit::createLiterPerKilometer(status));
821     measureUnit.adoptInstead(MeasureUnit::createMilePerGallon(status));
822     measureUnit.adoptInstead(MeasureUnit::createMilePerGallonImperial(status));
823     // measureUnit.adoptInstead(MeasureUnit::createEast(status));
824     // measureUnit.adoptInstead(MeasureUnit::createNorth(status));
825     // measureUnit.adoptInstead(MeasureUnit::createSouth(status));
826     // measureUnit.adoptInstead(MeasureUnit::createWest(status));
827     measureUnit.adoptInstead(MeasureUnit::createBit(status));
828     measureUnit.adoptInstead(MeasureUnit::createByte(status));
829     measureUnit.adoptInstead(MeasureUnit::createGigabit(status));
830     measureUnit.adoptInstead(MeasureUnit::createGigabyte(status));
831     measureUnit.adoptInstead(MeasureUnit::createKilobit(status));
832     measureUnit.adoptInstead(MeasureUnit::createKilobyte(status));
833     measureUnit.adoptInstead(MeasureUnit::createMegabit(status));
834     measureUnit.adoptInstead(MeasureUnit::createMegabyte(status));
835     measureUnit.adoptInstead(MeasureUnit::createTerabit(status));
836     measureUnit.adoptInstead(MeasureUnit::createTerabyte(status));
837     measureUnit.adoptInstead(MeasureUnit::createCentury(status));
838     measureUnit.adoptInstead(MeasureUnit::createDay(status));
839     measureUnit.adoptInstead(MeasureUnit::createHour(status));
840     measureUnit.adoptInstead(MeasureUnit::createMicrosecond(status));
841     measureUnit.adoptInstead(MeasureUnit::createMillisecond(status));
842     measureUnit.adoptInstead(MeasureUnit::createMinute(status));
843     measureUnit.adoptInstead(MeasureUnit::createMonth(status));
844     measureUnit.adoptInstead(MeasureUnit::createNanosecond(status));
845     measureUnit.adoptInstead(MeasureUnit::createSecond(status));
846     measureUnit.adoptInstead(MeasureUnit::createWeek(status));
847     measureUnit.adoptInstead(MeasureUnit::createYear(status));
848     measureUnit.adoptInstead(MeasureUnit::createAmpere(status));
849     measureUnit.adoptInstead(MeasureUnit::createMilliampere(status));
850     measureUnit.adoptInstead(MeasureUnit::createOhm(status));
851     measureUnit.adoptInstead(MeasureUnit::createVolt(status));
852     measureUnit.adoptInstead(MeasureUnit::createCalorie(status));
853     measureUnit.adoptInstead(MeasureUnit::createFoodcalorie(status));
854     measureUnit.adoptInstead(MeasureUnit::createJoule(status));
855     measureUnit.adoptInstead(MeasureUnit::createKilocalorie(status));
856     measureUnit.adoptInstead(MeasureUnit::createKilojoule(status));
857     measureUnit.adoptInstead(MeasureUnit::createKilowattHour(status));
858     measureUnit.adoptInstead(MeasureUnit::createGigahertz(status));
859     measureUnit.adoptInstead(MeasureUnit::createHertz(status));
860     measureUnit.adoptInstead(MeasureUnit::createKilohertz(status));
861     measureUnit.adoptInstead(MeasureUnit::createMegahertz(status));
862     measureUnit.adoptInstead(MeasureUnit::createAstronomicalUnit(status));
863     measureUnit.adoptInstead(MeasureUnit::createCentimeter(status));
864     measureUnit.adoptInstead(MeasureUnit::createDecimeter(status));
865     measureUnit.adoptInstead(MeasureUnit::createFathom(status));
866     measureUnit.adoptInstead(MeasureUnit::createFoot(status));
867     measureUnit.adoptInstead(MeasureUnit::createFurlong(status));
868     measureUnit.adoptInstead(MeasureUnit::createInch(status));
869     measureUnit.adoptInstead(MeasureUnit::createKilometer(status));
870     measureUnit.adoptInstead(MeasureUnit::createLightYear(status));
871     measureUnit.adoptInstead(MeasureUnit::createMeter(status));
872     measureUnit.adoptInstead(MeasureUnit::createMicrometer(status));
873     measureUnit.adoptInstead(MeasureUnit::createMile(status));
874     measureUnit.adoptInstead(MeasureUnit::createMileScandinavian(status));
875     measureUnit.adoptInstead(MeasureUnit::createMillimeter(status));
876     measureUnit.adoptInstead(MeasureUnit::createNanometer(status));
877     measureUnit.adoptInstead(MeasureUnit::createNauticalMile(status));
878     measureUnit.adoptInstead(MeasureUnit::createParsec(status));
879     measureUnit.adoptInstead(MeasureUnit::createPicometer(status));
880     measureUnit.adoptInstead(MeasureUnit::createYard(status));
881     measureUnit.adoptInstead(MeasureUnit::createLux(status));
882     measureUnit.adoptInstead(MeasureUnit::createCarat(status));
883     measureUnit.adoptInstead(MeasureUnit::createGram(status));
884     measureUnit.adoptInstead(MeasureUnit::createKilogram(status));
885     measureUnit.adoptInstead(MeasureUnit::createMetricTon(status));
886     measureUnit.adoptInstead(MeasureUnit::createMicrogram(status));
887     measureUnit.adoptInstead(MeasureUnit::createMilligram(status));
888     measureUnit.adoptInstead(MeasureUnit::createOunce(status));
889     measureUnit.adoptInstead(MeasureUnit::createOunceTroy(status));
890     measureUnit.adoptInstead(MeasureUnit::createPound(status));
891     measureUnit.adoptInstead(MeasureUnit::createStone(status));
892     measureUnit.adoptInstead(MeasureUnit::createTon(status));
893     measureUnit.adoptInstead(MeasureUnit::createGigawatt(status));
894     measureUnit.adoptInstead(MeasureUnit::createHorsepower(status));
895     measureUnit.adoptInstead(MeasureUnit::createKilowatt(status));
896     measureUnit.adoptInstead(MeasureUnit::createMegawatt(status));
897     measureUnit.adoptInstead(MeasureUnit::createMilliwatt(status));
898     measureUnit.adoptInstead(MeasureUnit::createWatt(status));
899     measureUnit.adoptInstead(MeasureUnit::createHectopascal(status));
900     measureUnit.adoptInstead(MeasureUnit::createInchHg(status));
901     measureUnit.adoptInstead(MeasureUnit::createMillibar(status));
902     measureUnit.adoptInstead(MeasureUnit::createMillimeterOfMercury(status));
903     measureUnit.adoptInstead(MeasureUnit::createPoundPerSquareInch(status));
904     measureUnit.adoptInstead(MeasureUnit::createKilometerPerHour(status));
905     measureUnit.adoptInstead(MeasureUnit::createKnot(status));
906     measureUnit.adoptInstead(MeasureUnit::createMeterPerSecond(status));
907     measureUnit.adoptInstead(MeasureUnit::createMilePerHour(status));
908     measureUnit.adoptInstead(MeasureUnit::createCelsius(status));
909     measureUnit.adoptInstead(MeasureUnit::createFahrenheit(status));
910     measureUnit.adoptInstead(MeasureUnit::createGenericTemperature(status));
911     measureUnit.adoptInstead(MeasureUnit::createKelvin(status));
912     measureUnit.adoptInstead(MeasureUnit::createAcreFoot(status));
913     measureUnit.adoptInstead(MeasureUnit::createBushel(status));
914     measureUnit.adoptInstead(MeasureUnit::createCentiliter(status));
915     measureUnit.adoptInstead(MeasureUnit::createCubicCentimeter(status));
916     measureUnit.adoptInstead(MeasureUnit::createCubicFoot(status));
917     measureUnit.adoptInstead(MeasureUnit::createCubicInch(status));
918     measureUnit.adoptInstead(MeasureUnit::createCubicKilometer(status));
919     measureUnit.adoptInstead(MeasureUnit::createCubicMeter(status));
920     measureUnit.adoptInstead(MeasureUnit::createCubicMile(status));
921     measureUnit.adoptInstead(MeasureUnit::createCubicYard(status));
922     measureUnit.adoptInstead(MeasureUnit::createCup(status));
923     measureUnit.adoptInstead(MeasureUnit::createCupMetric(status));
924     measureUnit.adoptInstead(MeasureUnit::createDeciliter(status));
925     measureUnit.adoptInstead(MeasureUnit::createFluidOunce(status));
926     measureUnit.adoptInstead(MeasureUnit::createGallon(status));
927     measureUnit.adoptInstead(MeasureUnit::createGallonImperial(status));
928     measureUnit.adoptInstead(MeasureUnit::createHectoliter(status));
929     measureUnit.adoptInstead(MeasureUnit::createLiter(status));
930     measureUnit.adoptInstead(MeasureUnit::createMegaliter(status));
931     measureUnit.adoptInstead(MeasureUnit::createMilliliter(status));
932     measureUnit.adoptInstead(MeasureUnit::createPint(status));
933     measureUnit.adoptInstead(MeasureUnit::createPintMetric(status));
934     measureUnit.adoptInstead(MeasureUnit::createQuart(status));
935     measureUnit.adoptInstead(MeasureUnit::createTablespoon(status));
936     measureUnit.adoptInstead(MeasureUnit::createTeaspoon(status));
937     assertSuccess("", status);
938 }
939 
TestCompatible59()940 void MeasureFormatTest::TestCompatible59() {
941     UErrorCode status = U_ZERO_ERROR;
942     LocalPointer<MeasureUnit> measureUnit;
943     measureUnit.adoptInstead(MeasureUnit::createGForce(status));
944     measureUnit.adoptInstead(MeasureUnit::createMeterPerSecondSquared(status));
945     measureUnit.adoptInstead(MeasureUnit::createArcMinute(status));
946     measureUnit.adoptInstead(MeasureUnit::createArcSecond(status));
947     measureUnit.adoptInstead(MeasureUnit::createDegree(status));
948     measureUnit.adoptInstead(MeasureUnit::createRadian(status));
949     measureUnit.adoptInstead(MeasureUnit::createRevolutionAngle(status));
950     measureUnit.adoptInstead(MeasureUnit::createAcre(status));
951     measureUnit.adoptInstead(MeasureUnit::createHectare(status));
952     measureUnit.adoptInstead(MeasureUnit::createSquareCentimeter(status));
953     measureUnit.adoptInstead(MeasureUnit::createSquareFoot(status));
954     measureUnit.adoptInstead(MeasureUnit::createSquareInch(status));
955     measureUnit.adoptInstead(MeasureUnit::createSquareKilometer(status));
956     measureUnit.adoptInstead(MeasureUnit::createSquareMeter(status));
957     measureUnit.adoptInstead(MeasureUnit::createSquareMile(status));
958     measureUnit.adoptInstead(MeasureUnit::createSquareYard(status));
959     measureUnit.adoptInstead(MeasureUnit::createKarat(status));
960     measureUnit.adoptInstead(MeasureUnit::createMilligramPerDeciliter(status));
961     measureUnit.adoptInstead(MeasureUnit::createMillimolePerLiter(status));
962     measureUnit.adoptInstead(MeasureUnit::createPartPerMillion(status));
963     measureUnit.adoptInstead(MeasureUnit::createLiterPer100Kilometers(status));
964     measureUnit.adoptInstead(MeasureUnit::createLiterPerKilometer(status));
965     measureUnit.adoptInstead(MeasureUnit::createMilePerGallon(status));
966     measureUnit.adoptInstead(MeasureUnit::createMilePerGallonImperial(status));
967     measureUnit.adoptInstead(MeasureUnit::createBit(status));
968     measureUnit.adoptInstead(MeasureUnit::createByte(status));
969     measureUnit.adoptInstead(MeasureUnit::createGigabit(status));
970     measureUnit.adoptInstead(MeasureUnit::createGigabyte(status));
971     measureUnit.adoptInstead(MeasureUnit::createKilobit(status));
972     measureUnit.adoptInstead(MeasureUnit::createKilobyte(status));
973     measureUnit.adoptInstead(MeasureUnit::createMegabit(status));
974     measureUnit.adoptInstead(MeasureUnit::createMegabyte(status));
975     measureUnit.adoptInstead(MeasureUnit::createTerabit(status));
976     measureUnit.adoptInstead(MeasureUnit::createTerabyte(status));
977     measureUnit.adoptInstead(MeasureUnit::createCentury(status));
978     measureUnit.adoptInstead(MeasureUnit::createDay(status));
979     measureUnit.adoptInstead(MeasureUnit::createHour(status));
980     measureUnit.adoptInstead(MeasureUnit::createMicrosecond(status));
981     measureUnit.adoptInstead(MeasureUnit::createMillisecond(status));
982     measureUnit.adoptInstead(MeasureUnit::createMinute(status));
983     measureUnit.adoptInstead(MeasureUnit::createMonth(status));
984     measureUnit.adoptInstead(MeasureUnit::createNanosecond(status));
985     measureUnit.adoptInstead(MeasureUnit::createSecond(status));
986     measureUnit.adoptInstead(MeasureUnit::createWeek(status));
987     measureUnit.adoptInstead(MeasureUnit::createYear(status));
988     measureUnit.adoptInstead(MeasureUnit::createAmpere(status));
989     measureUnit.adoptInstead(MeasureUnit::createMilliampere(status));
990     measureUnit.adoptInstead(MeasureUnit::createOhm(status));
991     measureUnit.adoptInstead(MeasureUnit::createVolt(status));
992     measureUnit.adoptInstead(MeasureUnit::createCalorie(status));
993     measureUnit.adoptInstead(MeasureUnit::createFoodcalorie(status));
994     measureUnit.adoptInstead(MeasureUnit::createJoule(status));
995     measureUnit.adoptInstead(MeasureUnit::createKilocalorie(status));
996     measureUnit.adoptInstead(MeasureUnit::createKilojoule(status));
997     measureUnit.adoptInstead(MeasureUnit::createKilowattHour(status));
998     measureUnit.adoptInstead(MeasureUnit::createGigahertz(status));
999     measureUnit.adoptInstead(MeasureUnit::createHertz(status));
1000     measureUnit.adoptInstead(MeasureUnit::createKilohertz(status));
1001     measureUnit.adoptInstead(MeasureUnit::createMegahertz(status));
1002     measureUnit.adoptInstead(MeasureUnit::createAstronomicalUnit(status));
1003     measureUnit.adoptInstead(MeasureUnit::createCentimeter(status));
1004     measureUnit.adoptInstead(MeasureUnit::createDecimeter(status));
1005     measureUnit.adoptInstead(MeasureUnit::createFathom(status));
1006     measureUnit.adoptInstead(MeasureUnit::createFoot(status));
1007     measureUnit.adoptInstead(MeasureUnit::createFurlong(status));
1008     measureUnit.adoptInstead(MeasureUnit::createInch(status));
1009     measureUnit.adoptInstead(MeasureUnit::createKilometer(status));
1010     measureUnit.adoptInstead(MeasureUnit::createLightYear(status));
1011     measureUnit.adoptInstead(MeasureUnit::createMeter(status));
1012     measureUnit.adoptInstead(MeasureUnit::createMicrometer(status));
1013     measureUnit.adoptInstead(MeasureUnit::createMile(status));
1014     measureUnit.adoptInstead(MeasureUnit::createMileScandinavian(status));
1015     measureUnit.adoptInstead(MeasureUnit::createMillimeter(status));
1016     measureUnit.adoptInstead(MeasureUnit::createNanometer(status));
1017     measureUnit.adoptInstead(MeasureUnit::createNauticalMile(status));
1018     measureUnit.adoptInstead(MeasureUnit::createParsec(status));
1019     measureUnit.adoptInstead(MeasureUnit::createPicometer(status));
1020     measureUnit.adoptInstead(MeasureUnit::createPoint(status));
1021     measureUnit.adoptInstead(MeasureUnit::createYard(status));
1022     measureUnit.adoptInstead(MeasureUnit::createLux(status));
1023     measureUnit.adoptInstead(MeasureUnit::createCarat(status));
1024     measureUnit.adoptInstead(MeasureUnit::createGram(status));
1025     measureUnit.adoptInstead(MeasureUnit::createKilogram(status));
1026     measureUnit.adoptInstead(MeasureUnit::createMetricTon(status));
1027     measureUnit.adoptInstead(MeasureUnit::createMicrogram(status));
1028     measureUnit.adoptInstead(MeasureUnit::createMilligram(status));
1029     measureUnit.adoptInstead(MeasureUnit::createOunce(status));
1030     measureUnit.adoptInstead(MeasureUnit::createOunceTroy(status));
1031     measureUnit.adoptInstead(MeasureUnit::createPound(status));
1032     measureUnit.adoptInstead(MeasureUnit::createStone(status));
1033     measureUnit.adoptInstead(MeasureUnit::createTon(status));
1034     measureUnit.adoptInstead(MeasureUnit::createGigawatt(status));
1035     measureUnit.adoptInstead(MeasureUnit::createHorsepower(status));
1036     measureUnit.adoptInstead(MeasureUnit::createKilowatt(status));
1037     measureUnit.adoptInstead(MeasureUnit::createMegawatt(status));
1038     measureUnit.adoptInstead(MeasureUnit::createMilliwatt(status));
1039     measureUnit.adoptInstead(MeasureUnit::createWatt(status));
1040     measureUnit.adoptInstead(MeasureUnit::createHectopascal(status));
1041     measureUnit.adoptInstead(MeasureUnit::createInchHg(status));
1042     measureUnit.adoptInstead(MeasureUnit::createMillibar(status));
1043     measureUnit.adoptInstead(MeasureUnit::createMillimeterOfMercury(status));
1044     measureUnit.adoptInstead(MeasureUnit::createPoundPerSquareInch(status));
1045     measureUnit.adoptInstead(MeasureUnit::createKilometerPerHour(status));
1046     measureUnit.adoptInstead(MeasureUnit::createKnot(status));
1047     measureUnit.adoptInstead(MeasureUnit::createMeterPerSecond(status));
1048     measureUnit.adoptInstead(MeasureUnit::createMilePerHour(status));
1049     measureUnit.adoptInstead(MeasureUnit::createCelsius(status));
1050     measureUnit.adoptInstead(MeasureUnit::createFahrenheit(status));
1051     measureUnit.adoptInstead(MeasureUnit::createGenericTemperature(status));
1052     measureUnit.adoptInstead(MeasureUnit::createKelvin(status));
1053     measureUnit.adoptInstead(MeasureUnit::createAcreFoot(status));
1054     measureUnit.adoptInstead(MeasureUnit::createBushel(status));
1055     measureUnit.adoptInstead(MeasureUnit::createCentiliter(status));
1056     measureUnit.adoptInstead(MeasureUnit::createCubicCentimeter(status));
1057     measureUnit.adoptInstead(MeasureUnit::createCubicFoot(status));
1058     measureUnit.adoptInstead(MeasureUnit::createCubicInch(status));
1059     measureUnit.adoptInstead(MeasureUnit::createCubicKilometer(status));
1060     measureUnit.adoptInstead(MeasureUnit::createCubicMeter(status));
1061     measureUnit.adoptInstead(MeasureUnit::createCubicMile(status));
1062     measureUnit.adoptInstead(MeasureUnit::createCubicYard(status));
1063     measureUnit.adoptInstead(MeasureUnit::createCup(status));
1064     measureUnit.adoptInstead(MeasureUnit::createCupMetric(status));
1065     measureUnit.adoptInstead(MeasureUnit::createDeciliter(status));
1066     measureUnit.adoptInstead(MeasureUnit::createFluidOunce(status));
1067     measureUnit.adoptInstead(MeasureUnit::createGallon(status));
1068     measureUnit.adoptInstead(MeasureUnit::createGallonImperial(status));
1069     measureUnit.adoptInstead(MeasureUnit::createHectoliter(status));
1070     measureUnit.adoptInstead(MeasureUnit::createLiter(status));
1071     measureUnit.adoptInstead(MeasureUnit::createMegaliter(status));
1072     measureUnit.adoptInstead(MeasureUnit::createMilliliter(status));
1073     measureUnit.adoptInstead(MeasureUnit::createPint(status));
1074     measureUnit.adoptInstead(MeasureUnit::createPintMetric(status));
1075     measureUnit.adoptInstead(MeasureUnit::createQuart(status));
1076     measureUnit.adoptInstead(MeasureUnit::createTablespoon(status));
1077     measureUnit.adoptInstead(MeasureUnit::createTeaspoon(status));
1078     assertSuccess("", status);
1079 }
1080 
1081 // Note that TestCompatible60(), TestCompatible61(), TestCompatible62()
1082 // would be the same as TestCompatible59(), no need to add them.
1083 
TestCompatible63()1084 void MeasureFormatTest::TestCompatible63() {
1085     UErrorCode status = U_ZERO_ERROR;
1086     LocalPointer<MeasureUnit> measureUnit;
1087     measureUnit.adoptInstead(MeasureUnit::createGForce(status));
1088     measureUnit.adoptInstead(MeasureUnit::createMeterPerSecondSquared(status));
1089     measureUnit.adoptInstead(MeasureUnit::createArcMinute(status));
1090     measureUnit.adoptInstead(MeasureUnit::createArcSecond(status));
1091     measureUnit.adoptInstead(MeasureUnit::createDegree(status));
1092     measureUnit.adoptInstead(MeasureUnit::createRadian(status));
1093     measureUnit.adoptInstead(MeasureUnit::createRevolutionAngle(status));
1094     measureUnit.adoptInstead(MeasureUnit::createAcre(status));
1095     measureUnit.adoptInstead(MeasureUnit::createHectare(status));
1096     measureUnit.adoptInstead(MeasureUnit::createSquareCentimeter(status));
1097     measureUnit.adoptInstead(MeasureUnit::createSquareFoot(status));
1098     measureUnit.adoptInstead(MeasureUnit::createSquareInch(status));
1099     measureUnit.adoptInstead(MeasureUnit::createSquareKilometer(status));
1100     measureUnit.adoptInstead(MeasureUnit::createSquareMeter(status));
1101     measureUnit.adoptInstead(MeasureUnit::createSquareMile(status));
1102     measureUnit.adoptInstead(MeasureUnit::createSquareYard(status));
1103     measureUnit.adoptInstead(MeasureUnit::createKarat(status));
1104     measureUnit.adoptInstead(MeasureUnit::createMilligramPerDeciliter(status));
1105     measureUnit.adoptInstead(MeasureUnit::createMillimolePerLiter(status));
1106     measureUnit.adoptInstead(MeasureUnit::createPartPerMillion(status));
1107     measureUnit.adoptInstead(MeasureUnit::createPercent(status));
1108     measureUnit.adoptInstead(MeasureUnit::createPermille(status));
1109     measureUnit.adoptInstead(MeasureUnit::createLiterPer100Kilometers(status));
1110     measureUnit.adoptInstead(MeasureUnit::createLiterPerKilometer(status));
1111     measureUnit.adoptInstead(MeasureUnit::createMilePerGallon(status));
1112     measureUnit.adoptInstead(MeasureUnit::createMilePerGallonImperial(status));
1113     measureUnit.adoptInstead(MeasureUnit::createBit(status));
1114     measureUnit.adoptInstead(MeasureUnit::createByte(status));
1115     measureUnit.adoptInstead(MeasureUnit::createGigabit(status));
1116     measureUnit.adoptInstead(MeasureUnit::createGigabyte(status));
1117     measureUnit.adoptInstead(MeasureUnit::createKilobit(status));
1118     measureUnit.adoptInstead(MeasureUnit::createKilobyte(status));
1119     measureUnit.adoptInstead(MeasureUnit::createMegabit(status));
1120     measureUnit.adoptInstead(MeasureUnit::createMegabyte(status));
1121     measureUnit.adoptInstead(MeasureUnit::createPetabyte(status));
1122     measureUnit.adoptInstead(MeasureUnit::createTerabit(status));
1123     measureUnit.adoptInstead(MeasureUnit::createTerabyte(status));
1124     measureUnit.adoptInstead(MeasureUnit::createCentury(status));
1125     measureUnit.adoptInstead(MeasureUnit::createDay(status));
1126     measureUnit.adoptInstead(MeasureUnit::createHour(status));
1127     measureUnit.adoptInstead(MeasureUnit::createMicrosecond(status));
1128     measureUnit.adoptInstead(MeasureUnit::createMillisecond(status));
1129     measureUnit.adoptInstead(MeasureUnit::createMinute(status));
1130     measureUnit.adoptInstead(MeasureUnit::createMonth(status));
1131     measureUnit.adoptInstead(MeasureUnit::createNanosecond(status));
1132     measureUnit.adoptInstead(MeasureUnit::createSecond(status));
1133     measureUnit.adoptInstead(MeasureUnit::createWeek(status));
1134     measureUnit.adoptInstead(MeasureUnit::createYear(status));
1135     measureUnit.adoptInstead(MeasureUnit::createAmpere(status));
1136     measureUnit.adoptInstead(MeasureUnit::createMilliampere(status));
1137     measureUnit.adoptInstead(MeasureUnit::createOhm(status));
1138     measureUnit.adoptInstead(MeasureUnit::createVolt(status));
1139     measureUnit.adoptInstead(MeasureUnit::createCalorie(status));
1140     measureUnit.adoptInstead(MeasureUnit::createFoodcalorie(status));
1141     measureUnit.adoptInstead(MeasureUnit::createJoule(status));
1142     measureUnit.adoptInstead(MeasureUnit::createKilocalorie(status));
1143     measureUnit.adoptInstead(MeasureUnit::createKilojoule(status));
1144     measureUnit.adoptInstead(MeasureUnit::createKilowattHour(status));
1145     measureUnit.adoptInstead(MeasureUnit::createGigahertz(status));
1146     measureUnit.adoptInstead(MeasureUnit::createHertz(status));
1147     measureUnit.adoptInstead(MeasureUnit::createKilohertz(status));
1148     measureUnit.adoptInstead(MeasureUnit::createMegahertz(status));
1149     measureUnit.adoptInstead(MeasureUnit::createAstronomicalUnit(status));
1150     measureUnit.adoptInstead(MeasureUnit::createCentimeter(status));
1151     measureUnit.adoptInstead(MeasureUnit::createDecimeter(status));
1152     measureUnit.adoptInstead(MeasureUnit::createFathom(status));
1153     measureUnit.adoptInstead(MeasureUnit::createFoot(status));
1154     measureUnit.adoptInstead(MeasureUnit::createFurlong(status));
1155     measureUnit.adoptInstead(MeasureUnit::createInch(status));
1156     measureUnit.adoptInstead(MeasureUnit::createKilometer(status));
1157     measureUnit.adoptInstead(MeasureUnit::createLightYear(status));
1158     measureUnit.adoptInstead(MeasureUnit::createMeter(status));
1159     measureUnit.adoptInstead(MeasureUnit::createMicrometer(status));
1160     measureUnit.adoptInstead(MeasureUnit::createMile(status));
1161     measureUnit.adoptInstead(MeasureUnit::createMileScandinavian(status));
1162     measureUnit.adoptInstead(MeasureUnit::createMillimeter(status));
1163     measureUnit.adoptInstead(MeasureUnit::createNanometer(status));
1164     measureUnit.adoptInstead(MeasureUnit::createNauticalMile(status));
1165     measureUnit.adoptInstead(MeasureUnit::createParsec(status));
1166     measureUnit.adoptInstead(MeasureUnit::createPicometer(status));
1167     measureUnit.adoptInstead(MeasureUnit::createPoint(status));
1168     measureUnit.adoptInstead(MeasureUnit::createYard(status));
1169     measureUnit.adoptInstead(MeasureUnit::createLux(status));
1170     measureUnit.adoptInstead(MeasureUnit::createCarat(status));
1171     measureUnit.adoptInstead(MeasureUnit::createGram(status));
1172     measureUnit.adoptInstead(MeasureUnit::createKilogram(status));
1173     measureUnit.adoptInstead(MeasureUnit::createMetricTon(status));
1174     measureUnit.adoptInstead(MeasureUnit::createMicrogram(status));
1175     measureUnit.adoptInstead(MeasureUnit::createMilligram(status));
1176     measureUnit.adoptInstead(MeasureUnit::createOunce(status));
1177     measureUnit.adoptInstead(MeasureUnit::createOunceTroy(status));
1178     measureUnit.adoptInstead(MeasureUnit::createPound(status));
1179     measureUnit.adoptInstead(MeasureUnit::createStone(status));
1180     measureUnit.adoptInstead(MeasureUnit::createTon(status));
1181     measureUnit.adoptInstead(MeasureUnit::createGigawatt(status));
1182     measureUnit.adoptInstead(MeasureUnit::createHorsepower(status));
1183     measureUnit.adoptInstead(MeasureUnit::createKilowatt(status));
1184     measureUnit.adoptInstead(MeasureUnit::createMegawatt(status));
1185     measureUnit.adoptInstead(MeasureUnit::createMilliwatt(status));
1186     measureUnit.adoptInstead(MeasureUnit::createWatt(status));
1187     measureUnit.adoptInstead(MeasureUnit::createAtmosphere(status));
1188     measureUnit.adoptInstead(MeasureUnit::createHectopascal(status));
1189     measureUnit.adoptInstead(MeasureUnit::createInchHg(status));
1190     measureUnit.adoptInstead(MeasureUnit::createMillibar(status));
1191     measureUnit.adoptInstead(MeasureUnit::createMillimeterOfMercury(status));
1192     measureUnit.adoptInstead(MeasureUnit::createPoundPerSquareInch(status));
1193     measureUnit.adoptInstead(MeasureUnit::createKilometerPerHour(status));
1194     measureUnit.adoptInstead(MeasureUnit::createKnot(status));
1195     measureUnit.adoptInstead(MeasureUnit::createMeterPerSecond(status));
1196     measureUnit.adoptInstead(MeasureUnit::createMilePerHour(status));
1197     measureUnit.adoptInstead(MeasureUnit::createCelsius(status));
1198     measureUnit.adoptInstead(MeasureUnit::createFahrenheit(status));
1199     measureUnit.adoptInstead(MeasureUnit::createGenericTemperature(status));
1200     measureUnit.adoptInstead(MeasureUnit::createKelvin(status));
1201     measureUnit.adoptInstead(MeasureUnit::createAcreFoot(status));
1202     measureUnit.adoptInstead(MeasureUnit::createBushel(status));
1203     measureUnit.adoptInstead(MeasureUnit::createCentiliter(status));
1204     measureUnit.adoptInstead(MeasureUnit::createCubicCentimeter(status));
1205     measureUnit.adoptInstead(MeasureUnit::createCubicFoot(status));
1206     measureUnit.adoptInstead(MeasureUnit::createCubicInch(status));
1207     measureUnit.adoptInstead(MeasureUnit::createCubicKilometer(status));
1208     measureUnit.adoptInstead(MeasureUnit::createCubicMeter(status));
1209     measureUnit.adoptInstead(MeasureUnit::createCubicMile(status));
1210     measureUnit.adoptInstead(MeasureUnit::createCubicYard(status));
1211     measureUnit.adoptInstead(MeasureUnit::createCup(status));
1212     measureUnit.adoptInstead(MeasureUnit::createCupMetric(status));
1213     measureUnit.adoptInstead(MeasureUnit::createDeciliter(status));
1214     measureUnit.adoptInstead(MeasureUnit::createFluidOunce(status));
1215     measureUnit.adoptInstead(MeasureUnit::createGallon(status));
1216     measureUnit.adoptInstead(MeasureUnit::createGallonImperial(status));
1217     measureUnit.adoptInstead(MeasureUnit::createHectoliter(status));
1218     measureUnit.adoptInstead(MeasureUnit::createLiter(status));
1219     measureUnit.adoptInstead(MeasureUnit::createMegaliter(status));
1220     measureUnit.adoptInstead(MeasureUnit::createMilliliter(status));
1221     measureUnit.adoptInstead(MeasureUnit::createPint(status));
1222     measureUnit.adoptInstead(MeasureUnit::createPintMetric(status));
1223     measureUnit.adoptInstead(MeasureUnit::createQuart(status));
1224     measureUnit.adoptInstead(MeasureUnit::createTablespoon(status));
1225     measureUnit.adoptInstead(MeasureUnit::createTeaspoon(status));
1226     assertSuccess("", status);
1227 }
1228 
TestCompatible64()1229 void MeasureFormatTest::TestCompatible64() {
1230     UErrorCode status = U_ZERO_ERROR;
1231     LocalPointer<MeasureUnit> measureUnit;
1232     MeasureUnit measureUnitValue;
1233     measureUnit.adoptInstead(MeasureUnit::createGForce(status));
1234     measureUnitValue = MeasureUnit::getGForce();
1235     measureUnit.adoptInstead(MeasureUnit::createMeterPerSecondSquared(status));
1236     measureUnitValue = MeasureUnit::getMeterPerSecondSquared();
1237     measureUnit.adoptInstead(MeasureUnit::createArcMinute(status));
1238     measureUnitValue = MeasureUnit::getArcMinute();
1239     measureUnit.adoptInstead(MeasureUnit::createArcSecond(status));
1240     measureUnitValue = MeasureUnit::getArcSecond();
1241     measureUnit.adoptInstead(MeasureUnit::createDegree(status));
1242     measureUnitValue = MeasureUnit::getDegree();
1243     measureUnit.adoptInstead(MeasureUnit::createRadian(status));
1244     measureUnitValue = MeasureUnit::getRadian();
1245     measureUnit.adoptInstead(MeasureUnit::createRevolutionAngle(status));
1246     measureUnitValue = MeasureUnit::getRevolutionAngle();
1247     measureUnit.adoptInstead(MeasureUnit::createAcre(status));
1248     measureUnitValue = MeasureUnit::getAcre();
1249     measureUnit.adoptInstead(MeasureUnit::createDunam(status));
1250     measureUnitValue = MeasureUnit::getDunam();
1251     measureUnit.adoptInstead(MeasureUnit::createHectare(status));
1252     measureUnitValue = MeasureUnit::getHectare();
1253     measureUnit.adoptInstead(MeasureUnit::createSquareCentimeter(status));
1254     measureUnitValue = MeasureUnit::getSquareCentimeter();
1255     measureUnit.adoptInstead(MeasureUnit::createSquareFoot(status));
1256     measureUnitValue = MeasureUnit::getSquareFoot();
1257     measureUnit.adoptInstead(MeasureUnit::createSquareInch(status));
1258     measureUnitValue = MeasureUnit::getSquareInch();
1259     measureUnit.adoptInstead(MeasureUnit::createSquareKilometer(status));
1260     measureUnitValue = MeasureUnit::getSquareKilometer();
1261     measureUnit.adoptInstead(MeasureUnit::createSquareMeter(status));
1262     measureUnitValue = MeasureUnit::getSquareMeter();
1263     measureUnit.adoptInstead(MeasureUnit::createSquareMile(status));
1264     measureUnitValue = MeasureUnit::getSquareMile();
1265     measureUnit.adoptInstead(MeasureUnit::createSquareYard(status));
1266     measureUnitValue = MeasureUnit::getSquareYard();
1267     measureUnit.adoptInstead(MeasureUnit::createKarat(status));
1268     measureUnitValue = MeasureUnit::getKarat();
1269     measureUnit.adoptInstead(MeasureUnit::createMilligramPerDeciliter(status));
1270     measureUnitValue = MeasureUnit::getMilligramPerDeciliter();
1271     measureUnit.adoptInstead(MeasureUnit::createMillimolePerLiter(status));
1272     measureUnitValue = MeasureUnit::getMillimolePerLiter();
1273     measureUnit.adoptInstead(MeasureUnit::createMole(status));
1274     measureUnitValue = MeasureUnit::getMole();
1275     measureUnit.adoptInstead(MeasureUnit::createPartPerMillion(status));
1276     measureUnitValue = MeasureUnit::getPartPerMillion();
1277     measureUnit.adoptInstead(MeasureUnit::createPercent(status));
1278     measureUnitValue = MeasureUnit::getPercent();
1279     measureUnit.adoptInstead(MeasureUnit::createPermille(status));
1280     measureUnitValue = MeasureUnit::getPermille();
1281     measureUnit.adoptInstead(MeasureUnit::createPermyriad(status));
1282     measureUnitValue = MeasureUnit::getPermyriad();
1283     measureUnit.adoptInstead(MeasureUnit::createLiterPer100Kilometers(status));
1284     measureUnitValue = MeasureUnit::getLiterPer100Kilometers();
1285     measureUnit.adoptInstead(MeasureUnit::createLiterPerKilometer(status));
1286     measureUnitValue = MeasureUnit::getLiterPerKilometer();
1287     measureUnit.adoptInstead(MeasureUnit::createMilePerGallon(status));
1288     measureUnitValue = MeasureUnit::getMilePerGallon();
1289     measureUnit.adoptInstead(MeasureUnit::createMilePerGallonImperial(status));
1290     measureUnitValue = MeasureUnit::getMilePerGallonImperial();
1291     measureUnit.adoptInstead(MeasureUnit::createBit(status));
1292     measureUnitValue = MeasureUnit::getBit();
1293     measureUnit.adoptInstead(MeasureUnit::createByte(status));
1294     measureUnitValue = MeasureUnit::getByte();
1295     measureUnit.adoptInstead(MeasureUnit::createGigabit(status));
1296     measureUnitValue = MeasureUnit::getGigabit();
1297     measureUnit.adoptInstead(MeasureUnit::createGigabyte(status));
1298     measureUnitValue = MeasureUnit::getGigabyte();
1299     measureUnit.adoptInstead(MeasureUnit::createKilobit(status));
1300     measureUnitValue = MeasureUnit::getKilobit();
1301     measureUnit.adoptInstead(MeasureUnit::createKilobyte(status));
1302     measureUnitValue = MeasureUnit::getKilobyte();
1303     measureUnit.adoptInstead(MeasureUnit::createMegabit(status));
1304     measureUnitValue = MeasureUnit::getMegabit();
1305     measureUnit.adoptInstead(MeasureUnit::createMegabyte(status));
1306     measureUnitValue = MeasureUnit::getMegabyte();
1307     measureUnit.adoptInstead(MeasureUnit::createPetabyte(status));
1308     measureUnitValue = MeasureUnit::getPetabyte();
1309     measureUnit.adoptInstead(MeasureUnit::createTerabit(status));
1310     measureUnitValue = MeasureUnit::getTerabit();
1311     measureUnit.adoptInstead(MeasureUnit::createTerabyte(status));
1312     measureUnitValue = MeasureUnit::getTerabyte();
1313     measureUnit.adoptInstead(MeasureUnit::createCentury(status));
1314     measureUnitValue = MeasureUnit::getCentury();
1315     measureUnit.adoptInstead(MeasureUnit::createDay(status));
1316     measureUnitValue = MeasureUnit::getDay();
1317     measureUnit.adoptInstead(MeasureUnit::createDayPerson(status));
1318     measureUnitValue = MeasureUnit::getDayPerson();
1319     measureUnit.adoptInstead(MeasureUnit::createHour(status));
1320     measureUnitValue = MeasureUnit::getHour();
1321     measureUnit.adoptInstead(MeasureUnit::createMicrosecond(status));
1322     measureUnitValue = MeasureUnit::getMicrosecond();
1323     measureUnit.adoptInstead(MeasureUnit::createMillisecond(status));
1324     measureUnitValue = MeasureUnit::getMillisecond();
1325     measureUnit.adoptInstead(MeasureUnit::createMinute(status));
1326     measureUnitValue = MeasureUnit::getMinute();
1327     measureUnit.adoptInstead(MeasureUnit::createMonth(status));
1328     measureUnitValue = MeasureUnit::getMonth();
1329     measureUnit.adoptInstead(MeasureUnit::createMonthPerson(status));
1330     measureUnitValue = MeasureUnit::getMonthPerson();
1331     measureUnit.adoptInstead(MeasureUnit::createNanosecond(status));
1332     measureUnitValue = MeasureUnit::getNanosecond();
1333     measureUnit.adoptInstead(MeasureUnit::createSecond(status));
1334     measureUnitValue = MeasureUnit::getSecond();
1335     measureUnit.adoptInstead(MeasureUnit::createWeek(status));
1336     measureUnitValue = MeasureUnit::getWeek();
1337     measureUnit.adoptInstead(MeasureUnit::createWeekPerson(status));
1338     measureUnitValue = MeasureUnit::getWeekPerson();
1339     measureUnit.adoptInstead(MeasureUnit::createYear(status));
1340     measureUnitValue = MeasureUnit::getYear();
1341     measureUnit.adoptInstead(MeasureUnit::createYearPerson(status));
1342     measureUnitValue = MeasureUnit::getYearPerson();
1343     measureUnit.adoptInstead(MeasureUnit::createAmpere(status));
1344     measureUnitValue = MeasureUnit::getAmpere();
1345     measureUnit.adoptInstead(MeasureUnit::createMilliampere(status));
1346     measureUnitValue = MeasureUnit::getMilliampere();
1347     measureUnit.adoptInstead(MeasureUnit::createOhm(status));
1348     measureUnitValue = MeasureUnit::getOhm();
1349     measureUnit.adoptInstead(MeasureUnit::createVolt(status));
1350     measureUnitValue = MeasureUnit::getVolt();
1351     measureUnit.adoptInstead(MeasureUnit::createBritishThermalUnit(status));
1352     measureUnitValue = MeasureUnit::getBritishThermalUnit();
1353     measureUnit.adoptInstead(MeasureUnit::createCalorie(status));
1354     measureUnitValue = MeasureUnit::getCalorie();
1355     measureUnit.adoptInstead(MeasureUnit::createElectronvolt(status));
1356     measureUnitValue = MeasureUnit::getElectronvolt();
1357     measureUnit.adoptInstead(MeasureUnit::createFoodcalorie(status));
1358     measureUnitValue = MeasureUnit::getFoodcalorie();
1359     measureUnit.adoptInstead(MeasureUnit::createJoule(status));
1360     measureUnitValue = MeasureUnit::getJoule();
1361     measureUnit.adoptInstead(MeasureUnit::createKilocalorie(status));
1362     measureUnitValue = MeasureUnit::getKilocalorie();
1363     measureUnit.adoptInstead(MeasureUnit::createKilojoule(status));
1364     measureUnitValue = MeasureUnit::getKilojoule();
1365     measureUnit.adoptInstead(MeasureUnit::createKilowattHour(status));
1366     measureUnitValue = MeasureUnit::getKilowattHour();
1367     measureUnit.adoptInstead(MeasureUnit::createNewton(status));
1368     measureUnitValue = MeasureUnit::getNewton();
1369     measureUnit.adoptInstead(MeasureUnit::createPoundForce(status));
1370     measureUnitValue = MeasureUnit::getPoundForce();
1371     measureUnit.adoptInstead(MeasureUnit::createGigahertz(status));
1372     measureUnitValue = MeasureUnit::getGigahertz();
1373     measureUnit.adoptInstead(MeasureUnit::createHertz(status));
1374     measureUnitValue = MeasureUnit::getHertz();
1375     measureUnit.adoptInstead(MeasureUnit::createKilohertz(status));
1376     measureUnitValue = MeasureUnit::getKilohertz();
1377     measureUnit.adoptInstead(MeasureUnit::createMegahertz(status));
1378     measureUnitValue = MeasureUnit::getMegahertz();
1379     measureUnit.adoptInstead(MeasureUnit::createAstronomicalUnit(status));
1380     measureUnitValue = MeasureUnit::getAstronomicalUnit();
1381     measureUnit.adoptInstead(MeasureUnit::createCentimeter(status));
1382     measureUnitValue = MeasureUnit::getCentimeter();
1383     measureUnit.adoptInstead(MeasureUnit::createDecimeter(status));
1384     measureUnitValue = MeasureUnit::getDecimeter();
1385     measureUnit.adoptInstead(MeasureUnit::createFathom(status));
1386     measureUnitValue = MeasureUnit::getFathom();
1387     measureUnit.adoptInstead(MeasureUnit::createFoot(status));
1388     measureUnitValue = MeasureUnit::getFoot();
1389     measureUnit.adoptInstead(MeasureUnit::createFurlong(status));
1390     measureUnitValue = MeasureUnit::getFurlong();
1391     measureUnit.adoptInstead(MeasureUnit::createInch(status));
1392     measureUnitValue = MeasureUnit::getInch();
1393     measureUnit.adoptInstead(MeasureUnit::createKilometer(status));
1394     measureUnitValue = MeasureUnit::getKilometer();
1395     measureUnit.adoptInstead(MeasureUnit::createLightYear(status));
1396     measureUnitValue = MeasureUnit::getLightYear();
1397     measureUnit.adoptInstead(MeasureUnit::createMeter(status));
1398     measureUnitValue = MeasureUnit::getMeter();
1399     measureUnit.adoptInstead(MeasureUnit::createMicrometer(status));
1400     measureUnitValue = MeasureUnit::getMicrometer();
1401     measureUnit.adoptInstead(MeasureUnit::createMile(status));
1402     measureUnitValue = MeasureUnit::getMile();
1403     measureUnit.adoptInstead(MeasureUnit::createMileScandinavian(status));
1404     measureUnitValue = MeasureUnit::getMileScandinavian();
1405     measureUnit.adoptInstead(MeasureUnit::createMillimeter(status));
1406     measureUnitValue = MeasureUnit::getMillimeter();
1407     measureUnit.adoptInstead(MeasureUnit::createNanometer(status));
1408     measureUnitValue = MeasureUnit::getNanometer();
1409     measureUnit.adoptInstead(MeasureUnit::createNauticalMile(status));
1410     measureUnitValue = MeasureUnit::getNauticalMile();
1411     measureUnit.adoptInstead(MeasureUnit::createParsec(status));
1412     measureUnitValue = MeasureUnit::getParsec();
1413     measureUnit.adoptInstead(MeasureUnit::createPicometer(status));
1414     measureUnitValue = MeasureUnit::getPicometer();
1415     measureUnit.adoptInstead(MeasureUnit::createPoint(status));
1416     measureUnitValue = MeasureUnit::getPoint();
1417     measureUnit.adoptInstead(MeasureUnit::createSolarRadius(status));
1418     measureUnitValue = MeasureUnit::getSolarRadius();
1419     measureUnit.adoptInstead(MeasureUnit::createYard(status));
1420     measureUnitValue = MeasureUnit::getYard();
1421     measureUnit.adoptInstead(MeasureUnit::createLux(status));
1422     measureUnitValue = MeasureUnit::getLux();
1423     measureUnit.adoptInstead(MeasureUnit::createSolarLuminosity(status));
1424     measureUnitValue = MeasureUnit::getSolarLuminosity();
1425     measureUnit.adoptInstead(MeasureUnit::createCarat(status));
1426     measureUnitValue = MeasureUnit::getCarat();
1427     measureUnit.adoptInstead(MeasureUnit::createDalton(status));
1428     measureUnitValue = MeasureUnit::getDalton();
1429     measureUnit.adoptInstead(MeasureUnit::createEarthMass(status));
1430     measureUnitValue = MeasureUnit::getEarthMass();
1431     measureUnit.adoptInstead(MeasureUnit::createGram(status));
1432     measureUnitValue = MeasureUnit::getGram();
1433     measureUnit.adoptInstead(MeasureUnit::createKilogram(status));
1434     measureUnitValue = MeasureUnit::getKilogram();
1435     measureUnit.adoptInstead(MeasureUnit::createMetricTon(status));
1436     measureUnitValue = MeasureUnit::getMetricTon();
1437     measureUnit.adoptInstead(MeasureUnit::createMicrogram(status));
1438     measureUnitValue = MeasureUnit::getMicrogram();
1439     measureUnit.adoptInstead(MeasureUnit::createMilligram(status));
1440     measureUnitValue = MeasureUnit::getMilligram();
1441     measureUnit.adoptInstead(MeasureUnit::createOunce(status));
1442     measureUnitValue = MeasureUnit::getOunce();
1443     measureUnit.adoptInstead(MeasureUnit::createOunceTroy(status));
1444     measureUnitValue = MeasureUnit::getOunceTroy();
1445     measureUnit.adoptInstead(MeasureUnit::createPound(status));
1446     measureUnitValue = MeasureUnit::getPound();
1447     measureUnit.adoptInstead(MeasureUnit::createSolarMass(status));
1448     measureUnitValue = MeasureUnit::getSolarMass();
1449     measureUnit.adoptInstead(MeasureUnit::createStone(status));
1450     measureUnitValue = MeasureUnit::getStone();
1451     measureUnit.adoptInstead(MeasureUnit::createTon(status));
1452     measureUnitValue = MeasureUnit::getTon();
1453     measureUnit.adoptInstead(MeasureUnit::createGigawatt(status));
1454     measureUnitValue = MeasureUnit::getGigawatt();
1455     measureUnit.adoptInstead(MeasureUnit::createHorsepower(status));
1456     measureUnitValue = MeasureUnit::getHorsepower();
1457     measureUnit.adoptInstead(MeasureUnit::createKilowatt(status));
1458     measureUnitValue = MeasureUnit::getKilowatt();
1459     measureUnit.adoptInstead(MeasureUnit::createMegawatt(status));
1460     measureUnitValue = MeasureUnit::getMegawatt();
1461     measureUnit.adoptInstead(MeasureUnit::createMilliwatt(status));
1462     measureUnitValue = MeasureUnit::getMilliwatt();
1463     measureUnit.adoptInstead(MeasureUnit::createWatt(status));
1464     measureUnitValue = MeasureUnit::getWatt();
1465     measureUnit.adoptInstead(MeasureUnit::createAtmosphere(status));
1466     measureUnitValue = MeasureUnit::getAtmosphere();
1467     measureUnit.adoptInstead(MeasureUnit::createHectopascal(status));
1468     measureUnitValue = MeasureUnit::getHectopascal();
1469     measureUnit.adoptInstead(MeasureUnit::createInchHg(status));
1470     measureUnitValue = MeasureUnit::getInchHg();
1471     measureUnit.adoptInstead(MeasureUnit::createKilopascal(status));
1472     measureUnitValue = MeasureUnit::getKilopascal();
1473     measureUnit.adoptInstead(MeasureUnit::createMegapascal(status));
1474     measureUnitValue = MeasureUnit::getMegapascal();
1475     measureUnit.adoptInstead(MeasureUnit::createMillibar(status));
1476     measureUnitValue = MeasureUnit::getMillibar();
1477     measureUnit.adoptInstead(MeasureUnit::createMillimeterOfMercury(status));
1478     measureUnitValue = MeasureUnit::getMillimeterOfMercury();
1479     measureUnit.adoptInstead(MeasureUnit::createPoundPerSquareInch(status));
1480     measureUnitValue = MeasureUnit::getPoundPerSquareInch();
1481     measureUnit.adoptInstead(MeasureUnit::createKilometerPerHour(status));
1482     measureUnitValue = MeasureUnit::getKilometerPerHour();
1483     measureUnit.adoptInstead(MeasureUnit::createKnot(status));
1484     measureUnitValue = MeasureUnit::getKnot();
1485     measureUnit.adoptInstead(MeasureUnit::createMeterPerSecond(status));
1486     measureUnitValue = MeasureUnit::getMeterPerSecond();
1487     measureUnit.adoptInstead(MeasureUnit::createMilePerHour(status));
1488     measureUnitValue = MeasureUnit::getMilePerHour();
1489     measureUnit.adoptInstead(MeasureUnit::createCelsius(status));
1490     measureUnitValue = MeasureUnit::getCelsius();
1491     measureUnit.adoptInstead(MeasureUnit::createFahrenheit(status));
1492     measureUnitValue = MeasureUnit::getFahrenheit();
1493     measureUnit.adoptInstead(MeasureUnit::createGenericTemperature(status));
1494     measureUnitValue = MeasureUnit::getGenericTemperature();
1495     measureUnit.adoptInstead(MeasureUnit::createKelvin(status));
1496     measureUnitValue = MeasureUnit::getKelvin();
1497     measureUnit.adoptInstead(MeasureUnit::createNewtonMeter(status));
1498     measureUnitValue = MeasureUnit::getNewtonMeter();
1499     measureUnit.adoptInstead(MeasureUnit::createPoundFoot(status));
1500     measureUnitValue = MeasureUnit::getPoundFoot();
1501     measureUnit.adoptInstead(MeasureUnit::createAcreFoot(status));
1502     measureUnitValue = MeasureUnit::getAcreFoot();
1503     measureUnit.adoptInstead(MeasureUnit::createBarrel(status));
1504     measureUnitValue = MeasureUnit::getBarrel();
1505     measureUnit.adoptInstead(MeasureUnit::createBushel(status));
1506     measureUnitValue = MeasureUnit::getBushel();
1507     measureUnit.adoptInstead(MeasureUnit::createCentiliter(status));
1508     measureUnitValue = MeasureUnit::getCentiliter();
1509     measureUnit.adoptInstead(MeasureUnit::createCubicCentimeter(status));
1510     measureUnitValue = MeasureUnit::getCubicCentimeter();
1511     measureUnit.adoptInstead(MeasureUnit::createCubicFoot(status));
1512     measureUnitValue = MeasureUnit::getCubicFoot();
1513     measureUnit.adoptInstead(MeasureUnit::createCubicInch(status));
1514     measureUnitValue = MeasureUnit::getCubicInch();
1515     measureUnit.adoptInstead(MeasureUnit::createCubicKilometer(status));
1516     measureUnitValue = MeasureUnit::getCubicKilometer();
1517     measureUnit.adoptInstead(MeasureUnit::createCubicMeter(status));
1518     measureUnitValue = MeasureUnit::getCubicMeter();
1519     measureUnit.adoptInstead(MeasureUnit::createCubicMile(status));
1520     measureUnitValue = MeasureUnit::getCubicMile();
1521     measureUnit.adoptInstead(MeasureUnit::createCubicYard(status));
1522     measureUnitValue = MeasureUnit::getCubicYard();
1523     measureUnit.adoptInstead(MeasureUnit::createCup(status));
1524     measureUnitValue = MeasureUnit::getCup();
1525     measureUnit.adoptInstead(MeasureUnit::createCupMetric(status));
1526     measureUnitValue = MeasureUnit::getCupMetric();
1527     measureUnit.adoptInstead(MeasureUnit::createDeciliter(status));
1528     measureUnitValue = MeasureUnit::getDeciliter();
1529     measureUnit.adoptInstead(MeasureUnit::createFluidOunce(status));
1530     measureUnitValue = MeasureUnit::getFluidOunce();
1531     measureUnit.adoptInstead(MeasureUnit::createFluidOunceImperial(status));
1532     measureUnitValue = MeasureUnit::getFluidOunceImperial();
1533     measureUnit.adoptInstead(MeasureUnit::createGallon(status));
1534     measureUnitValue = MeasureUnit::getGallon();
1535     measureUnit.adoptInstead(MeasureUnit::createGallonImperial(status));
1536     measureUnitValue = MeasureUnit::getGallonImperial();
1537     measureUnit.adoptInstead(MeasureUnit::createHectoliter(status));
1538     measureUnitValue = MeasureUnit::getHectoliter();
1539     measureUnit.adoptInstead(MeasureUnit::createLiter(status));
1540     measureUnitValue = MeasureUnit::getLiter();
1541     measureUnit.adoptInstead(MeasureUnit::createMegaliter(status));
1542     measureUnitValue = MeasureUnit::getMegaliter();
1543     measureUnit.adoptInstead(MeasureUnit::createMilliliter(status));
1544     measureUnitValue = MeasureUnit::getMilliliter();
1545     measureUnit.adoptInstead(MeasureUnit::createPint(status));
1546     measureUnitValue = MeasureUnit::getPint();
1547     measureUnit.adoptInstead(MeasureUnit::createPintMetric(status));
1548     measureUnitValue = MeasureUnit::getPintMetric();
1549     measureUnit.adoptInstead(MeasureUnit::createQuart(status));
1550     measureUnitValue = MeasureUnit::getQuart();
1551     measureUnit.adoptInstead(MeasureUnit::createTablespoon(status));
1552     measureUnitValue = MeasureUnit::getTablespoon();
1553     measureUnit.adoptInstead(MeasureUnit::createTeaspoon(status));
1554     measureUnitValue = MeasureUnit::getTeaspoon();
1555     assertSuccess("", status);
1556 }
1557 
TestCompatible65()1558 void MeasureFormatTest::TestCompatible65() {
1559     UErrorCode status = U_ZERO_ERROR;
1560     LocalPointer<MeasureUnit> measureUnit;
1561     MeasureUnit measureUnitValue;
1562     measureUnit.adoptInstead(MeasureUnit::createGForce(status));
1563     measureUnitValue = MeasureUnit::getGForce();
1564     measureUnit.adoptInstead(MeasureUnit::createMeterPerSecondSquared(status));
1565     measureUnitValue = MeasureUnit::getMeterPerSecondSquared();
1566     measureUnit.adoptInstead(MeasureUnit::createArcMinute(status));
1567     measureUnitValue = MeasureUnit::getArcMinute();
1568     measureUnit.adoptInstead(MeasureUnit::createArcSecond(status));
1569     measureUnitValue = MeasureUnit::getArcSecond();
1570     measureUnit.adoptInstead(MeasureUnit::createDegree(status));
1571     measureUnitValue = MeasureUnit::getDegree();
1572     measureUnit.adoptInstead(MeasureUnit::createRadian(status));
1573     measureUnitValue = MeasureUnit::getRadian();
1574     measureUnit.adoptInstead(MeasureUnit::createRevolutionAngle(status));
1575     measureUnitValue = MeasureUnit::getRevolutionAngle();
1576     measureUnit.adoptInstead(MeasureUnit::createAcre(status));
1577     measureUnitValue = MeasureUnit::getAcre();
1578     measureUnit.adoptInstead(MeasureUnit::createDunam(status));
1579     measureUnitValue = MeasureUnit::getDunam();
1580     measureUnit.adoptInstead(MeasureUnit::createHectare(status));
1581     measureUnitValue = MeasureUnit::getHectare();
1582     measureUnit.adoptInstead(MeasureUnit::createSquareCentimeter(status));
1583     measureUnitValue = MeasureUnit::getSquareCentimeter();
1584     measureUnit.adoptInstead(MeasureUnit::createSquareFoot(status));
1585     measureUnitValue = MeasureUnit::getSquareFoot();
1586     measureUnit.adoptInstead(MeasureUnit::createSquareInch(status));
1587     measureUnitValue = MeasureUnit::getSquareInch();
1588     measureUnit.adoptInstead(MeasureUnit::createSquareKilometer(status));
1589     measureUnitValue = MeasureUnit::getSquareKilometer();
1590     measureUnit.adoptInstead(MeasureUnit::createSquareMeter(status));
1591     measureUnitValue = MeasureUnit::getSquareMeter();
1592     measureUnit.adoptInstead(MeasureUnit::createSquareMile(status));
1593     measureUnitValue = MeasureUnit::getSquareMile();
1594     measureUnit.adoptInstead(MeasureUnit::createSquareYard(status));
1595     measureUnitValue = MeasureUnit::getSquareYard();
1596     measureUnit.adoptInstead(MeasureUnit::createKarat(status));
1597     measureUnitValue = MeasureUnit::getKarat();
1598     measureUnit.adoptInstead(MeasureUnit::createMilligramPerDeciliter(status));
1599     measureUnitValue = MeasureUnit::getMilligramPerDeciliter();
1600     measureUnit.adoptInstead(MeasureUnit::createMillimolePerLiter(status));
1601     measureUnitValue = MeasureUnit::getMillimolePerLiter();
1602     measureUnit.adoptInstead(MeasureUnit::createMole(status));
1603     measureUnitValue = MeasureUnit::getMole();
1604     measureUnit.adoptInstead(MeasureUnit::createPartPerMillion(status));
1605     measureUnitValue = MeasureUnit::getPartPerMillion();
1606     measureUnit.adoptInstead(MeasureUnit::createPercent(status));
1607     measureUnitValue = MeasureUnit::getPercent();
1608     measureUnit.adoptInstead(MeasureUnit::createPermille(status));
1609     measureUnitValue = MeasureUnit::getPermille();
1610     measureUnit.adoptInstead(MeasureUnit::createPermyriad(status));
1611     measureUnitValue = MeasureUnit::getPermyriad();
1612     measureUnit.adoptInstead(MeasureUnit::createLiterPer100Kilometers(status));
1613     measureUnitValue = MeasureUnit::getLiterPer100Kilometers();
1614     measureUnit.adoptInstead(MeasureUnit::createLiterPerKilometer(status));
1615     measureUnitValue = MeasureUnit::getLiterPerKilometer();
1616     measureUnit.adoptInstead(MeasureUnit::createMilePerGallon(status));
1617     measureUnitValue = MeasureUnit::getMilePerGallon();
1618     measureUnit.adoptInstead(MeasureUnit::createMilePerGallonImperial(status));
1619     measureUnitValue = MeasureUnit::getMilePerGallonImperial();
1620     measureUnit.adoptInstead(MeasureUnit::createBit(status));
1621     measureUnitValue = MeasureUnit::getBit();
1622     measureUnit.adoptInstead(MeasureUnit::createByte(status));
1623     measureUnitValue = MeasureUnit::getByte();
1624     measureUnit.adoptInstead(MeasureUnit::createGigabit(status));
1625     measureUnitValue = MeasureUnit::getGigabit();
1626     measureUnit.adoptInstead(MeasureUnit::createGigabyte(status));
1627     measureUnitValue = MeasureUnit::getGigabyte();
1628     measureUnit.adoptInstead(MeasureUnit::createKilobit(status));
1629     measureUnitValue = MeasureUnit::getKilobit();
1630     measureUnit.adoptInstead(MeasureUnit::createKilobyte(status));
1631     measureUnitValue = MeasureUnit::getKilobyte();
1632     measureUnit.adoptInstead(MeasureUnit::createMegabit(status));
1633     measureUnitValue = MeasureUnit::getMegabit();
1634     measureUnit.adoptInstead(MeasureUnit::createMegabyte(status));
1635     measureUnitValue = MeasureUnit::getMegabyte();
1636     measureUnit.adoptInstead(MeasureUnit::createPetabyte(status));
1637     measureUnitValue = MeasureUnit::getPetabyte();
1638     measureUnit.adoptInstead(MeasureUnit::createTerabit(status));
1639     measureUnitValue = MeasureUnit::getTerabit();
1640     measureUnit.adoptInstead(MeasureUnit::createTerabyte(status));
1641     measureUnitValue = MeasureUnit::getTerabyte();
1642     measureUnit.adoptInstead(MeasureUnit::createCentury(status));
1643     measureUnitValue = MeasureUnit::getCentury();
1644     measureUnit.adoptInstead(MeasureUnit::createDay(status));
1645     measureUnitValue = MeasureUnit::getDay();
1646     measureUnit.adoptInstead(MeasureUnit::createDayPerson(status));
1647     measureUnitValue = MeasureUnit::getDayPerson();
1648     measureUnit.adoptInstead(MeasureUnit::createDecade(status));
1649     measureUnitValue = MeasureUnit::getDecade();
1650     measureUnit.adoptInstead(MeasureUnit::createHour(status));
1651     measureUnitValue = MeasureUnit::getHour();
1652     measureUnit.adoptInstead(MeasureUnit::createMicrosecond(status));
1653     measureUnitValue = MeasureUnit::getMicrosecond();
1654     measureUnit.adoptInstead(MeasureUnit::createMillisecond(status));
1655     measureUnitValue = MeasureUnit::getMillisecond();
1656     measureUnit.adoptInstead(MeasureUnit::createMinute(status));
1657     measureUnitValue = MeasureUnit::getMinute();
1658     measureUnit.adoptInstead(MeasureUnit::createMonth(status));
1659     measureUnitValue = MeasureUnit::getMonth();
1660     measureUnit.adoptInstead(MeasureUnit::createMonthPerson(status));
1661     measureUnitValue = MeasureUnit::getMonthPerson();
1662     measureUnit.adoptInstead(MeasureUnit::createNanosecond(status));
1663     measureUnitValue = MeasureUnit::getNanosecond();
1664     measureUnit.adoptInstead(MeasureUnit::createSecond(status));
1665     measureUnitValue = MeasureUnit::getSecond();
1666     measureUnit.adoptInstead(MeasureUnit::createWeek(status));
1667     measureUnitValue = MeasureUnit::getWeek();
1668     measureUnit.adoptInstead(MeasureUnit::createWeekPerson(status));
1669     measureUnitValue = MeasureUnit::getWeekPerson();
1670     measureUnit.adoptInstead(MeasureUnit::createYear(status));
1671     measureUnitValue = MeasureUnit::getYear();
1672     measureUnit.adoptInstead(MeasureUnit::createYearPerson(status));
1673     measureUnitValue = MeasureUnit::getYearPerson();
1674     measureUnit.adoptInstead(MeasureUnit::createAmpere(status));
1675     measureUnitValue = MeasureUnit::getAmpere();
1676     measureUnit.adoptInstead(MeasureUnit::createMilliampere(status));
1677     measureUnitValue = MeasureUnit::getMilliampere();
1678     measureUnit.adoptInstead(MeasureUnit::createOhm(status));
1679     measureUnitValue = MeasureUnit::getOhm();
1680     measureUnit.adoptInstead(MeasureUnit::createVolt(status));
1681     measureUnitValue = MeasureUnit::getVolt();
1682     measureUnit.adoptInstead(MeasureUnit::createBritishThermalUnit(status));
1683     measureUnitValue = MeasureUnit::getBritishThermalUnit();
1684     measureUnit.adoptInstead(MeasureUnit::createCalorie(status));
1685     measureUnitValue = MeasureUnit::getCalorie();
1686     measureUnit.adoptInstead(MeasureUnit::createElectronvolt(status));
1687     measureUnitValue = MeasureUnit::getElectronvolt();
1688     measureUnit.adoptInstead(MeasureUnit::createFoodcalorie(status));
1689     measureUnitValue = MeasureUnit::getFoodcalorie();
1690     measureUnit.adoptInstead(MeasureUnit::createJoule(status));
1691     measureUnitValue = MeasureUnit::getJoule();
1692     measureUnit.adoptInstead(MeasureUnit::createKilocalorie(status));
1693     measureUnitValue = MeasureUnit::getKilocalorie();
1694     measureUnit.adoptInstead(MeasureUnit::createKilojoule(status));
1695     measureUnitValue = MeasureUnit::getKilojoule();
1696     measureUnit.adoptInstead(MeasureUnit::createKilowattHour(status));
1697     measureUnitValue = MeasureUnit::getKilowattHour();
1698     measureUnit.adoptInstead(MeasureUnit::createThermUs(status));
1699     measureUnitValue = MeasureUnit::getThermUs();
1700     measureUnit.adoptInstead(MeasureUnit::createNewton(status));
1701     measureUnitValue = MeasureUnit::getNewton();
1702     measureUnit.adoptInstead(MeasureUnit::createPoundForce(status));
1703     measureUnitValue = MeasureUnit::getPoundForce();
1704     measureUnit.adoptInstead(MeasureUnit::createGigahertz(status));
1705     measureUnitValue = MeasureUnit::getGigahertz();
1706     measureUnit.adoptInstead(MeasureUnit::createHertz(status));
1707     measureUnitValue = MeasureUnit::getHertz();
1708     measureUnit.adoptInstead(MeasureUnit::createKilohertz(status));
1709     measureUnitValue = MeasureUnit::getKilohertz();
1710     measureUnit.adoptInstead(MeasureUnit::createMegahertz(status));
1711     measureUnitValue = MeasureUnit::getMegahertz();
1712     measureUnit.adoptInstead(MeasureUnit::createDotPerCentimeter(status));
1713     measureUnitValue = MeasureUnit::getDotPerCentimeter();
1714     measureUnit.adoptInstead(MeasureUnit::createDotPerInch(status));
1715     measureUnitValue = MeasureUnit::getDotPerInch();
1716     measureUnit.adoptInstead(MeasureUnit::createEm(status));
1717     measureUnitValue = MeasureUnit::getEm();
1718     measureUnit.adoptInstead(MeasureUnit::createMegapixel(status));
1719     measureUnitValue = MeasureUnit::getMegapixel();
1720     measureUnit.adoptInstead(MeasureUnit::createPixel(status));
1721     measureUnitValue = MeasureUnit::getPixel();
1722     measureUnit.adoptInstead(MeasureUnit::createPixelPerCentimeter(status));
1723     measureUnitValue = MeasureUnit::getPixelPerCentimeter();
1724     measureUnit.adoptInstead(MeasureUnit::createPixelPerInch(status));
1725     measureUnitValue = MeasureUnit::getPixelPerInch();
1726     measureUnit.adoptInstead(MeasureUnit::createAstronomicalUnit(status));
1727     measureUnitValue = MeasureUnit::getAstronomicalUnit();
1728     measureUnit.adoptInstead(MeasureUnit::createCentimeter(status));
1729     measureUnitValue = MeasureUnit::getCentimeter();
1730     measureUnit.adoptInstead(MeasureUnit::createDecimeter(status));
1731     measureUnitValue = MeasureUnit::getDecimeter();
1732     measureUnit.adoptInstead(MeasureUnit::createFathom(status));
1733     measureUnitValue = MeasureUnit::getFathom();
1734     measureUnit.adoptInstead(MeasureUnit::createFoot(status));
1735     measureUnitValue = MeasureUnit::getFoot();
1736     measureUnit.adoptInstead(MeasureUnit::createFurlong(status));
1737     measureUnitValue = MeasureUnit::getFurlong();
1738     measureUnit.adoptInstead(MeasureUnit::createInch(status));
1739     measureUnitValue = MeasureUnit::getInch();
1740     measureUnit.adoptInstead(MeasureUnit::createKilometer(status));
1741     measureUnitValue = MeasureUnit::getKilometer();
1742     measureUnit.adoptInstead(MeasureUnit::createLightYear(status));
1743     measureUnitValue = MeasureUnit::getLightYear();
1744     measureUnit.adoptInstead(MeasureUnit::createMeter(status));
1745     measureUnitValue = MeasureUnit::getMeter();
1746     measureUnit.adoptInstead(MeasureUnit::createMicrometer(status));
1747     measureUnitValue = MeasureUnit::getMicrometer();
1748     measureUnit.adoptInstead(MeasureUnit::createMile(status));
1749     measureUnitValue = MeasureUnit::getMile();
1750     measureUnit.adoptInstead(MeasureUnit::createMileScandinavian(status));
1751     measureUnitValue = MeasureUnit::getMileScandinavian();
1752     measureUnit.adoptInstead(MeasureUnit::createMillimeter(status));
1753     measureUnitValue = MeasureUnit::getMillimeter();
1754     measureUnit.adoptInstead(MeasureUnit::createNanometer(status));
1755     measureUnitValue = MeasureUnit::getNanometer();
1756     measureUnit.adoptInstead(MeasureUnit::createNauticalMile(status));
1757     measureUnitValue = MeasureUnit::getNauticalMile();
1758     measureUnit.adoptInstead(MeasureUnit::createParsec(status));
1759     measureUnitValue = MeasureUnit::getParsec();
1760     measureUnit.adoptInstead(MeasureUnit::createPicometer(status));
1761     measureUnitValue = MeasureUnit::getPicometer();
1762     measureUnit.adoptInstead(MeasureUnit::createPoint(status));
1763     measureUnitValue = MeasureUnit::getPoint();
1764     measureUnit.adoptInstead(MeasureUnit::createSolarRadius(status));
1765     measureUnitValue = MeasureUnit::getSolarRadius();
1766     measureUnit.adoptInstead(MeasureUnit::createYard(status));
1767     measureUnitValue = MeasureUnit::getYard();
1768     measureUnit.adoptInstead(MeasureUnit::createLux(status));
1769     measureUnitValue = MeasureUnit::getLux();
1770     measureUnit.adoptInstead(MeasureUnit::createSolarLuminosity(status));
1771     measureUnitValue = MeasureUnit::getSolarLuminosity();
1772     measureUnit.adoptInstead(MeasureUnit::createCarat(status));
1773     measureUnitValue = MeasureUnit::getCarat();
1774     measureUnit.adoptInstead(MeasureUnit::createDalton(status));
1775     measureUnitValue = MeasureUnit::getDalton();
1776     measureUnit.adoptInstead(MeasureUnit::createEarthMass(status));
1777     measureUnitValue = MeasureUnit::getEarthMass();
1778     measureUnit.adoptInstead(MeasureUnit::createGram(status));
1779     measureUnitValue = MeasureUnit::getGram();
1780     measureUnit.adoptInstead(MeasureUnit::createKilogram(status));
1781     measureUnitValue = MeasureUnit::getKilogram();
1782     measureUnit.adoptInstead(MeasureUnit::createMetricTon(status));
1783     measureUnitValue = MeasureUnit::getMetricTon();
1784     measureUnit.adoptInstead(MeasureUnit::createMicrogram(status));
1785     measureUnitValue = MeasureUnit::getMicrogram();
1786     measureUnit.adoptInstead(MeasureUnit::createMilligram(status));
1787     measureUnitValue = MeasureUnit::getMilligram();
1788     measureUnit.adoptInstead(MeasureUnit::createOunce(status));
1789     measureUnitValue = MeasureUnit::getOunce();
1790     measureUnit.adoptInstead(MeasureUnit::createOunceTroy(status));
1791     measureUnitValue = MeasureUnit::getOunceTroy();
1792     measureUnit.adoptInstead(MeasureUnit::createPound(status));
1793     measureUnitValue = MeasureUnit::getPound();
1794     measureUnit.adoptInstead(MeasureUnit::createSolarMass(status));
1795     measureUnitValue = MeasureUnit::getSolarMass();
1796     measureUnit.adoptInstead(MeasureUnit::createStone(status));
1797     measureUnitValue = MeasureUnit::getStone();
1798     measureUnit.adoptInstead(MeasureUnit::createTon(status));
1799     measureUnitValue = MeasureUnit::getTon();
1800     measureUnit.adoptInstead(MeasureUnit::createGigawatt(status));
1801     measureUnitValue = MeasureUnit::getGigawatt();
1802     measureUnit.adoptInstead(MeasureUnit::createHorsepower(status));
1803     measureUnitValue = MeasureUnit::getHorsepower();
1804     measureUnit.adoptInstead(MeasureUnit::createKilowatt(status));
1805     measureUnitValue = MeasureUnit::getKilowatt();
1806     measureUnit.adoptInstead(MeasureUnit::createMegawatt(status));
1807     measureUnitValue = MeasureUnit::getMegawatt();
1808     measureUnit.adoptInstead(MeasureUnit::createMilliwatt(status));
1809     measureUnitValue = MeasureUnit::getMilliwatt();
1810     measureUnit.adoptInstead(MeasureUnit::createWatt(status));
1811     measureUnitValue = MeasureUnit::getWatt();
1812     measureUnit.adoptInstead(MeasureUnit::createAtmosphere(status));
1813     measureUnitValue = MeasureUnit::getAtmosphere();
1814     measureUnit.adoptInstead(MeasureUnit::createBar(status));
1815     measureUnitValue = MeasureUnit::getBar();
1816     measureUnit.adoptInstead(MeasureUnit::createHectopascal(status));
1817     measureUnitValue = MeasureUnit::getHectopascal();
1818     measureUnit.adoptInstead(MeasureUnit::createInchHg(status));
1819     measureUnitValue = MeasureUnit::getInchHg();
1820     measureUnit.adoptInstead(MeasureUnit::createKilopascal(status));
1821     measureUnitValue = MeasureUnit::getKilopascal();
1822     measureUnit.adoptInstead(MeasureUnit::createMegapascal(status));
1823     measureUnitValue = MeasureUnit::getMegapascal();
1824     measureUnit.adoptInstead(MeasureUnit::createMillibar(status));
1825     measureUnitValue = MeasureUnit::getMillibar();
1826     measureUnit.adoptInstead(MeasureUnit::createMillimeterOfMercury(status));
1827     measureUnitValue = MeasureUnit::getMillimeterOfMercury();
1828     measureUnit.adoptInstead(MeasureUnit::createPascal(status));
1829     measureUnitValue = MeasureUnit::getPascal();
1830     measureUnit.adoptInstead(MeasureUnit::createPoundPerSquareInch(status));
1831     measureUnitValue = MeasureUnit::getPoundPerSquareInch();
1832     measureUnit.adoptInstead(MeasureUnit::createKilometerPerHour(status));
1833     measureUnitValue = MeasureUnit::getKilometerPerHour();
1834     measureUnit.adoptInstead(MeasureUnit::createKnot(status));
1835     measureUnitValue = MeasureUnit::getKnot();
1836     measureUnit.adoptInstead(MeasureUnit::createMeterPerSecond(status));
1837     measureUnitValue = MeasureUnit::getMeterPerSecond();
1838     measureUnit.adoptInstead(MeasureUnit::createMilePerHour(status));
1839     measureUnitValue = MeasureUnit::getMilePerHour();
1840     measureUnit.adoptInstead(MeasureUnit::createCelsius(status));
1841     measureUnitValue = MeasureUnit::getCelsius();
1842     measureUnit.adoptInstead(MeasureUnit::createFahrenheit(status));
1843     measureUnitValue = MeasureUnit::getFahrenheit();
1844     measureUnit.adoptInstead(MeasureUnit::createGenericTemperature(status));
1845     measureUnitValue = MeasureUnit::getGenericTemperature();
1846     measureUnit.adoptInstead(MeasureUnit::createKelvin(status));
1847     measureUnitValue = MeasureUnit::getKelvin();
1848     measureUnit.adoptInstead(MeasureUnit::createNewtonMeter(status));
1849     measureUnitValue = MeasureUnit::getNewtonMeter();
1850     measureUnit.adoptInstead(MeasureUnit::createPoundFoot(status));
1851     measureUnitValue = MeasureUnit::getPoundFoot();
1852     measureUnit.adoptInstead(MeasureUnit::createAcreFoot(status));
1853     measureUnitValue = MeasureUnit::getAcreFoot();
1854     measureUnit.adoptInstead(MeasureUnit::createBarrel(status));
1855     measureUnitValue = MeasureUnit::getBarrel();
1856     measureUnit.adoptInstead(MeasureUnit::createBushel(status));
1857     measureUnitValue = MeasureUnit::getBushel();
1858     measureUnit.adoptInstead(MeasureUnit::createCentiliter(status));
1859     measureUnitValue = MeasureUnit::getCentiliter();
1860     measureUnit.adoptInstead(MeasureUnit::createCubicCentimeter(status));
1861     measureUnitValue = MeasureUnit::getCubicCentimeter();
1862     measureUnit.adoptInstead(MeasureUnit::createCubicFoot(status));
1863     measureUnitValue = MeasureUnit::getCubicFoot();
1864     measureUnit.adoptInstead(MeasureUnit::createCubicInch(status));
1865     measureUnitValue = MeasureUnit::getCubicInch();
1866     measureUnit.adoptInstead(MeasureUnit::createCubicKilometer(status));
1867     measureUnitValue = MeasureUnit::getCubicKilometer();
1868     measureUnit.adoptInstead(MeasureUnit::createCubicMeter(status));
1869     measureUnitValue = MeasureUnit::getCubicMeter();
1870     measureUnit.adoptInstead(MeasureUnit::createCubicMile(status));
1871     measureUnitValue = MeasureUnit::getCubicMile();
1872     measureUnit.adoptInstead(MeasureUnit::createCubicYard(status));
1873     measureUnitValue = MeasureUnit::getCubicYard();
1874     measureUnit.adoptInstead(MeasureUnit::createCup(status));
1875     measureUnitValue = MeasureUnit::getCup();
1876     measureUnit.adoptInstead(MeasureUnit::createCupMetric(status));
1877     measureUnitValue = MeasureUnit::getCupMetric();
1878     measureUnit.adoptInstead(MeasureUnit::createDeciliter(status));
1879     measureUnitValue = MeasureUnit::getDeciliter();
1880     measureUnit.adoptInstead(MeasureUnit::createFluidOunce(status));
1881     measureUnitValue = MeasureUnit::getFluidOunce();
1882     measureUnit.adoptInstead(MeasureUnit::createFluidOunceImperial(status));
1883     measureUnitValue = MeasureUnit::getFluidOunceImperial();
1884     measureUnit.adoptInstead(MeasureUnit::createGallon(status));
1885     measureUnitValue = MeasureUnit::getGallon();
1886     measureUnit.adoptInstead(MeasureUnit::createGallonImperial(status));
1887     measureUnitValue = MeasureUnit::getGallonImperial();
1888     measureUnit.adoptInstead(MeasureUnit::createHectoliter(status));
1889     measureUnitValue = MeasureUnit::getHectoliter();
1890     measureUnit.adoptInstead(MeasureUnit::createLiter(status));
1891     measureUnitValue = MeasureUnit::getLiter();
1892     measureUnit.adoptInstead(MeasureUnit::createMegaliter(status));
1893     measureUnitValue = MeasureUnit::getMegaliter();
1894     measureUnit.adoptInstead(MeasureUnit::createMilliliter(status));
1895     measureUnitValue = MeasureUnit::getMilliliter();
1896     measureUnit.adoptInstead(MeasureUnit::createPint(status));
1897     measureUnitValue = MeasureUnit::getPint();
1898     measureUnit.adoptInstead(MeasureUnit::createPintMetric(status));
1899     measureUnitValue = MeasureUnit::getPintMetric();
1900     measureUnit.adoptInstead(MeasureUnit::createQuart(status));
1901     measureUnitValue = MeasureUnit::getQuart();
1902     measureUnit.adoptInstead(MeasureUnit::createTablespoon(status));
1903     measureUnitValue = MeasureUnit::getTablespoon();
1904     measureUnit.adoptInstead(MeasureUnit::createTeaspoon(status));
1905     measureUnitValue = MeasureUnit::getTeaspoon();
1906     assertSuccess("", status);
1907 }
1908 
TestBasic()1909 void MeasureFormatTest::TestBasic() {
1910     UErrorCode status = U_ZERO_ERROR;
1911     MeasureUnit *ptr1 = MeasureUnit::createArcMinute(status);
1912     MeasureUnit *ptr2 = MeasureUnit::createArcMinute(status);
1913     if (!(*ptr1 == *ptr2)) {
1914         errln("Expect == to work.");
1915     }
1916     if (*ptr1 != *ptr2) {
1917         errln("Expect != to work.");
1918     }
1919     MeasureUnit *ptr3 = MeasureUnit::createMeter(status);
1920     if (*ptr1 == *ptr3) {
1921         errln("Expect == to work.");
1922     }
1923     if (!(*ptr1 != *ptr3)) {
1924         errln("Expect != to work.");
1925     }
1926     MeasureUnit *ptr4 = ptr1->clone();
1927     if (*ptr1 != *ptr4) {
1928         errln("Expect clone to work.");
1929     }
1930     MeasureUnit stack;
1931     stack = *ptr1;
1932     if (*ptr1 != stack) {
1933         errln("Expect assignment to work.");
1934     }
1935 
1936     delete ptr1;
1937     delete ptr2;
1938     delete ptr3;
1939     delete ptr4;
1940 }
1941 
TestGetAvailable()1942 void MeasureFormatTest::TestGetAvailable() {
1943     MeasureUnit *units = NULL;
1944     UErrorCode status = U_ZERO_ERROR;
1945     int32_t totalCount = MeasureUnit::getAvailable(units, 0, status);
1946     while (status == U_BUFFER_OVERFLOW_ERROR) {
1947         status = U_ZERO_ERROR;
1948         delete [] units;
1949         units = new MeasureUnit[totalCount];
1950         totalCount = MeasureUnit::getAvailable(units, totalCount, status);
1951     }
1952     if (U_FAILURE(status)) {
1953         dataerrln("Failure creating format object - %s", u_errorName(status));
1954         delete [] units;
1955         return;
1956     }
1957     if (totalCount < 200) {
1958         errln("Expect at least 200 measure units including currencies.");
1959     }
1960     delete [] units;
1961     StringEnumeration *types = MeasureUnit::getAvailableTypes(status);
1962     if (U_FAILURE(status)) {
1963         dataerrln("Failure getting types - %s", u_errorName(status));
1964         delete types;
1965         return;
1966     }
1967     if (types->count(status) < 10) {
1968         errln("Expect at least 10 distinct unit types.");
1969     }
1970     units = NULL;
1971     int32_t unitCapacity = 0;
1972     int32_t unitCountSum = 0;
1973     for (
1974             const char* type = types->next(NULL, status);
1975             type != NULL;
1976             type = types->next(NULL, status)) {
1977         int32_t unitCount = MeasureUnit::getAvailable(type, units, unitCapacity, status);
1978         while (status == U_BUFFER_OVERFLOW_ERROR) {
1979             status = U_ZERO_ERROR;
1980             delete [] units;
1981             units = new MeasureUnit[unitCount];
1982             unitCapacity = unitCount;
1983             unitCount = MeasureUnit::getAvailable(type, units, unitCapacity, status);
1984         }
1985         if (U_FAILURE(status)) {
1986             dataerrln("Failure getting units - %s", u_errorName(status));
1987             delete [] units;
1988             delete types;
1989             return;
1990         }
1991         if (unitCount < 1) {
1992             errln("Expect at least one unit count per type.");
1993         }
1994         unitCountSum += unitCount;
1995     }
1996     if (unitCountSum != totalCount) {
1997         errln("Expected total unit count to equal sum of unit counts by type.");
1998     }
1999     delete [] units;
2000     delete types;
2001 }
2002 
TestExamplesInDocs()2003 void MeasureFormatTest::TestExamplesInDocs() {
2004     UErrorCode status = U_ZERO_ERROR;
2005     MeasureFormat fmtFr(Locale::getFrench(), UMEASFMT_WIDTH_SHORT, status);
2006     MeasureFormat fmtFrFull(
2007             Locale::getFrench(), UMEASFMT_WIDTH_WIDE, status);
2008     MeasureFormat fmtFrNarrow(
2009             Locale::getFrench(), UMEASFMT_WIDTH_NARROW, status);
2010     MeasureFormat fmtEn(Locale::getUS(), UMEASFMT_WIDTH_WIDE, status);
2011     if (!assertSuccess("Error creating formatters", status)) {
2012         return;
2013     }
2014     Measure measureC((double)23, MeasureUnit::createCelsius(status), status);
2015     Measure measureF((double)70, MeasureUnit::createFahrenheit(status), status);
2016     Measure feetAndInches[] = {
2017             Measure((double)70, MeasureUnit::createFoot(status), status),
2018             Measure((double)5.3, MeasureUnit::createInch(status), status)};
2019     Measure footAndInch[] = {
2020             Measure((double)1, MeasureUnit::createFoot(status), status),
2021             Measure((double)1, MeasureUnit::createInch(status), status)};
2022     Measure inchAndFeet[] = {
2023             Measure((double)1, MeasureUnit::createInch(status), status),
2024             Measure((double)2, MeasureUnit::createFoot(status), status)};
2025     if (!assertSuccess("Error creating measurements.", status)) {
2026         return;
2027     }
2028     verifyFormat(
2029             "Celsius",
2030             fmtFr,
2031             &measureC,
2032             1,
2033             "23\\u202F\\u00B0C");
2034     verifyFormatWithPrefix(
2035             "Celsius",
2036             fmtFr,
2037             "Prefix: ",
2038             &measureC,
2039             1,
2040             "Prefix: 23\\u202F\\u00B0C");
2041     verifyFormat(
2042             "Fahrenheit",
2043             fmtFr,
2044             &measureF,
2045             1,
2046             "70\\u202F\\u00B0F");
2047     verifyFormat(
2048             "Feet and inches",
2049             fmtFrFull,
2050             feetAndInches,
2051             UPRV_LENGTHOF(feetAndInches),
2052             "70 pieds et 5,3\\u00A0pouces");
2053     verifyFormatWithPrefix(
2054             "Feet and inches",
2055             fmtFrFull,
2056             "Prefix: ",
2057             feetAndInches,
2058             UPRV_LENGTHOF(feetAndInches),
2059             "Prefix: 70 pieds et 5,3\\u00A0pouces");
2060     verifyFormat(
2061             "Foot and inch",
2062             fmtFrFull,
2063             footAndInch,
2064             UPRV_LENGTHOF(footAndInch),
2065             "1\\u00A0pied et 1\\u00A0pouce");
2066     verifyFormat(
2067             "Foot and inch narrow",
2068             fmtFrNarrow,
2069             footAndInch,
2070             UPRV_LENGTHOF(footAndInch),
2071             "1\\u2032 1\\u2033");
2072     verifyFormat(
2073             "Inch and feet",
2074             fmtEn,
2075             inchAndFeet,
2076             UPRV_LENGTHOF(inchAndFeet),
2077             "1 inch, 2 feet");
2078 }
2079 
TestFormatPeriodEn()2080 void MeasureFormatTest::TestFormatPeriodEn() {
2081     UErrorCode status = U_ZERO_ERROR;
2082     Measure t_1y[] = {Measure((double)1, MeasureUnit::createYear(status), status)};
2083     Measure t_5M[] = {Measure((double)5, MeasureUnit::createMonth(status), status)};
2084     Measure t_4d[] = {Measure((double)4, MeasureUnit::createDay(status), status)};
2085     Measure t_2h[] = {Measure((double)2, MeasureUnit::createHour(status), status)};
2086     Measure t_19m[] = {Measure((double)19, MeasureUnit::createMinute(status), status)};
2087     Measure t_1h_23_5s[] = {
2088             Measure((double)1.0, MeasureUnit::createHour(status), status),
2089             Measure((double)23.5, MeasureUnit::createSecond(status), status)
2090     };
2091     Measure t_1h_23_5m[] = {
2092             Measure((double)1.0, MeasureUnit::createHour(status), status),
2093             Measure((double)23.5, MeasureUnit::createMinute(status), status)
2094     };
2095     Measure t_1h_0m_23s[] = {
2096             Measure(
2097                     (double)1.0,
2098                     TimeUnit::createInstance(
2099                             TimeUnit::UTIMEUNIT_HOUR, status),
2100                     status),
2101             Measure(
2102                     (double)0.0,
2103                     TimeUnit::createInstance(
2104                             TimeUnit::UTIMEUNIT_MINUTE, status),
2105                      status),
2106             Measure(
2107                     (double)23.0,
2108                     TimeUnit::createInstance(
2109                             TimeUnit::UTIMEUNIT_SECOND, status),
2110                     status)
2111     };
2112     Measure t_2y_5M_3w_4d[] = {
2113             Measure(2.0, MeasureUnit::createYear(status), status),
2114             Measure(5.0, MeasureUnit::createMonth(status), status),
2115             Measure(3.0, MeasureUnit::createWeek(status), status),
2116             Measure(4.0, MeasureUnit::createDay(status), status)
2117     };
2118     Measure t_1m_59_9996s[] = {
2119             Measure(1.0, MeasureUnit::createMinute(status), status),
2120             Measure(59.9996, MeasureUnit::createSecond(status), status)
2121     };
2122     Measure t_5h_17m[] = {
2123             Measure(5.0, MeasureUnit::createHour(status), status),
2124             Measure(17.0, MeasureUnit::createMinute(status), status)
2125     };
2126     Measure t_neg5h_17m[] = {
2127             Measure(-5.0, MeasureUnit::createHour(status), status),
2128             Measure(17.0, MeasureUnit::createMinute(status), status)
2129     };
2130     Measure t_19m_28s[] = {
2131             Measure(19.0, MeasureUnit::createMinute(status), status),
2132             Measure(28.0, MeasureUnit::createSecond(status), status)
2133     };
2134     Measure t_0h_0m_9s[] = {
2135             Measure(0.0, MeasureUnit::createHour(status), status),
2136             Measure(0.0, MeasureUnit::createMinute(status), status),
2137             Measure(9.0, MeasureUnit::createSecond(status), status)
2138     };
2139     Measure t_0h_0m_17s[] = {
2140             Measure(0.0, MeasureUnit::createHour(status), status),
2141             Measure(0.0, MeasureUnit::createMinute(status), status),
2142             Measure(17.0, MeasureUnit::createSecond(status), status)
2143     };
2144     Measure t_6h_56_92m[] = {
2145             Measure(6.0, MeasureUnit::createHour(status), status),
2146             Measure(56.92, MeasureUnit::createMinute(status), status)
2147     };
2148     Measure t_3h_4s_5m[] = {
2149             Measure(3.0, MeasureUnit::createHour(status), status),
2150             Measure(4.0, MeasureUnit::createSecond(status), status),
2151             Measure(5.0, MeasureUnit::createMinute(status), status)
2152     };
2153     Measure t_6_7h_56_92m[] = {
2154             Measure(6.7, MeasureUnit::createHour(status), status),
2155             Measure(56.92, MeasureUnit::createMinute(status), status)
2156     };
2157 
2158     Measure t_3h_5h[] = {
2159             Measure(3.0, MeasureUnit::createHour(status), status),
2160             Measure(5.0, MeasureUnit::createHour(status), status)
2161     };
2162 
2163     if (!assertSuccess("Error creating Measure objects", status)) {
2164         return;
2165     }
2166 
2167     ExpectedResult fullData[] = {
2168             {t_1m_59_9996s, UPRV_LENGTHOF(t_1m_59_9996s), "1 minute, 59.9996 seconds"},
2169             {t_19m, UPRV_LENGTHOF(t_19m), "19 minutes"},
2170             {t_1h_23_5s, UPRV_LENGTHOF(t_1h_23_5s), "1 hour, 23.5 seconds"},
2171             {t_1h_23_5m, UPRV_LENGTHOF(t_1h_23_5m), "1 hour, 23.5 minutes"},
2172             {t_1h_0m_23s, UPRV_LENGTHOF(t_1h_0m_23s), "1 hour, 0 minutes, 23 seconds"},
2173             {t_2y_5M_3w_4d, UPRV_LENGTHOF(t_2y_5M_3w_4d), "2 years, 5 months, 3 weeks, 4 days"}};
2174 
2175     ExpectedResult abbrevData[] = {
2176             {t_1m_59_9996s, UPRV_LENGTHOF(t_1m_59_9996s), "1 min, 59.9996 sec"},
2177             {t_19m, UPRV_LENGTHOF(t_19m), "19 min"},
2178             {t_1h_23_5s, UPRV_LENGTHOF(t_1h_23_5s), "1 hr, 23.5 sec"},
2179             {t_1h_23_5m, UPRV_LENGTHOF(t_1h_23_5m), "1 hr, 23.5 min"},
2180             {t_1h_0m_23s, UPRV_LENGTHOF(t_1h_0m_23s), "1 hr, 0 min, 23 sec"},
2181             {t_2y_5M_3w_4d, UPRV_LENGTHOF(t_2y_5M_3w_4d), "2 yrs, 5 mths, 3 wks, 4 days"}};
2182 
2183     ExpectedResult narrowData[] = {
2184             {t_1m_59_9996s, UPRV_LENGTHOF(t_1m_59_9996s), "1m 59.9996s"},
2185             {t_19m, UPRV_LENGTHOF(t_19m), "19m"},
2186             {t_1h_23_5s, UPRV_LENGTHOF(t_1h_23_5s), "1h 23.5s"},
2187             {t_1h_23_5m, UPRV_LENGTHOF(t_1h_23_5m), "1h 23.5m"},
2188             {t_1h_0m_23s, UPRV_LENGTHOF(t_1h_0m_23s), "1h 0m 23s"},
2189             {t_2y_5M_3w_4d, UPRV_LENGTHOF(t_2y_5M_3w_4d), "2y 5m 3w 4d"}};
2190 
2191     ExpectedResult numericData[] = {
2192             {t_1m_59_9996s, UPRV_LENGTHOF(t_1m_59_9996s), "1:59.9996"},
2193             {t_19m, UPRV_LENGTHOF(t_19m), "19m"},
2194             {t_1h_23_5s, UPRV_LENGTHOF(t_1h_23_5s), "1:00:23.5"},
2195             {t_1h_23_5m, UPRV_LENGTHOF(t_1h_23_5m), "1:23.5"},
2196             {t_1h_0m_23s, UPRV_LENGTHOF(t_1h_0m_23s), "1:00:23"},
2197             {t_5h_17m, UPRV_LENGTHOF(t_5h_17m), "5:17"},
2198             {t_neg5h_17m, UPRV_LENGTHOF(t_neg5h_17m), "-5h 17m"},
2199             {t_19m_28s, UPRV_LENGTHOF(t_19m_28s), "19:28"},
2200             {t_2y_5M_3w_4d, UPRV_LENGTHOF(t_2y_5M_3w_4d), "2y 5m 3w 4d"},
2201             {t_0h_0m_9s, UPRV_LENGTHOF(t_0h_0m_9s), "0:00:09"},
2202             {t_6h_56_92m, UPRV_LENGTHOF(t_6h_56_92m), "6:56.92"},
2203             {t_6_7h_56_92m, UPRV_LENGTHOF(t_6_7h_56_92m), "6:56.92"},
2204             {t_3h_4s_5m, UPRV_LENGTHOF(t_3h_4s_5m), "3h 4s 5m"},
2205             {t_3h_5h, UPRV_LENGTHOF(t_3h_5h), "3h 5h"}};
2206 
2207     ExpectedResult fullDataDe[] = {
2208             {t_1m_59_9996s, UPRV_LENGTHOF(t_1m_59_9996s), "1 Minute, 59,9996 Sekunden"},
2209             {t_19m, UPRV_LENGTHOF(t_19m), "19 Minuten"},
2210             {t_1h_23_5s, UPRV_LENGTHOF(t_1h_23_5s), "1 Stunde, 23,5 Sekunden"},
2211             {t_1h_23_5m, UPRV_LENGTHOF(t_1h_23_5m), "1 Stunde, 23,5 Minuten"},
2212             {t_1h_0m_23s, UPRV_LENGTHOF(t_1h_0m_23s), "1 Stunde, 0 Minuten und 23 Sekunden"},
2213             {t_2y_5M_3w_4d, UPRV_LENGTHOF(t_2y_5M_3w_4d), "2 Jahre, 5 Monate, 3 Wochen und 4 Tage"}};
2214 
2215     ExpectedResult numericDataDe[] = {
2216             {t_1m_59_9996s, UPRV_LENGTHOF(t_1m_59_9996s), "1:59,9996"},
2217             {t_19m, UPRV_LENGTHOF(t_19m), "19 Min."},
2218             {t_1h_23_5s, UPRV_LENGTHOF(t_1h_23_5s), "1:00:23,5"},
2219             {t_1h_23_5m, UPRV_LENGTHOF(t_1h_23_5m), "1:23,5"},
2220             {t_1h_0m_23s, UPRV_LENGTHOF(t_1h_0m_23s), "1:00:23"},
2221             {t_5h_17m, UPRV_LENGTHOF(t_5h_17m), "5:17"},
2222             {t_19m_28s, UPRV_LENGTHOF(t_19m_28s), "19:28"},
2223             {t_2y_5M_3w_4d, UPRV_LENGTHOF(t_2y_5M_3w_4d), "2 J, 5 M, 3 W und 4 T"},
2224             {t_0h_0m_17s, UPRV_LENGTHOF(t_0h_0m_17s), "0:00:17"},
2225             {t_6h_56_92m, UPRV_LENGTHOF(t_6h_56_92m), "6:56,92"},
2226             {t_3h_5h, UPRV_LENGTHOF(t_3h_5h), "3 Std., 5 Std."}};
2227 
2228     ExpectedResult numericDataBn[] = {
2229             {t_1m_59_9996s, UPRV_LENGTHOF(t_1m_59_9996s), "\\u09E7:\\u09EB\\u09EF.\\u09EF\\u09EF\\u09EF\\u09EC"},
2230             {t_19m, UPRV_LENGTHOF(t_19m), "\\u09E7\\u09EF \\u09AE\\u09BF\\u0983"},
2231             {t_1h_23_5s, UPRV_LENGTHOF(t_1h_23_5s), "\\u09E7:\\u09E6\\u09E6:\\u09E8\\u09E9.\\u09EB"},
2232             {t_1h_0m_23s, UPRV_LENGTHOF(t_1h_0m_23s), "\\u09E7:\\u09E6\\u09E6:\\u09E8\\u09E9"},
2233             {t_1h_23_5m, UPRV_LENGTHOF(t_1h_23_5m), "\\u09E7:\\u09E8\\u09E9.\\u09EB"},
2234             {t_5h_17m, UPRV_LENGTHOF(t_5h_17m), "\\u09EB:\\u09E7\\u09ED"},
2235             {t_19m_28s, UPRV_LENGTHOF(t_19m_28s), "\\u09E7\\u09EF:\\u09E8\\u09EE"},
2236             {t_2y_5M_3w_4d, UPRV_LENGTHOF(t_2y_5M_3w_4d), "\\u09E8 \\u09AC\\u099B\\u09B0, \\u09EB \\u09AE\\u09BE\\u09B8, \\u09E9 \\u09B8\\u09AA\\u09CD\\u09A4\\u09BE\\u09B9, \\u09EA \\u09A6\\u09BF\\u09A8"},
2237             {t_0h_0m_17s, UPRV_LENGTHOF(t_0h_0m_17s), "\\u09E6:\\u09E6\\u09E6:\\u09E7\\u09ED"},
2238             {t_6h_56_92m, UPRV_LENGTHOF(t_6h_56_92m), "\\u09EC:\\u09EB\\u09EC.\\u09EF\\u09E8"},
2239             {t_3h_5h, UPRV_LENGTHOF(t_3h_5h), "\\u09E9 \\u0998\\u0983, \\u09EB \\u0998\\u0983"}};
2240 
2241     ExpectedResult numericDataBnLatn[] = {
2242             {t_1m_59_9996s, UPRV_LENGTHOF(t_1m_59_9996s), "1:59.9996"},
2243             {t_19m, UPRV_LENGTHOF(t_19m), "19 \\u09AE\\u09BF\\u0983"},
2244             {t_1h_23_5s, UPRV_LENGTHOF(t_1h_23_5s), "1:00:23.5"},
2245             {t_1h_0m_23s, UPRV_LENGTHOF(t_1h_0m_23s), "1:00:23"},
2246             {t_1h_23_5m, UPRV_LENGTHOF(t_1h_23_5m), "1:23.5"},
2247             {t_5h_17m, UPRV_LENGTHOF(t_5h_17m), "5:17"},
2248             {t_19m_28s, UPRV_LENGTHOF(t_19m_28s), "19:28"},
2249             {t_2y_5M_3w_4d, UPRV_LENGTHOF(t_2y_5M_3w_4d), "2 \\u09AC\\u099B\\u09B0, 5 \\u09AE\\u09BE\\u09B8, 3 \\u09B8\\u09AA\\u09CD\\u09A4\\u09BE\\u09B9, 4 \\u09A6\\u09BF\\u09A8"},
2250             {t_0h_0m_17s, UPRV_LENGTHOF(t_0h_0m_17s), "0:00:17"},
2251             {t_6h_56_92m, UPRV_LENGTHOF(t_6h_56_92m), "6:56.92"},
2252             {t_3h_5h, UPRV_LENGTHOF(t_3h_5h), "3 \\u0998\\u0983, 5 \\u0998\\u0983"}};
2253 
2254     ExpectedResult fullDataSpellout[] = {
2255             {t_1y, UPRV_LENGTHOF(t_1y), "one year"},
2256             {t_5M, UPRV_LENGTHOF(t_5M), "five months"},
2257             {t_4d, UPRV_LENGTHOF(t_4d), "four days"},
2258             {t_2h, UPRV_LENGTHOF(t_2h), "two hours"},
2259             {t_19m, UPRV_LENGTHOF(t_19m), "nineteen minutes"}};
2260 
2261     ExpectedResult fullDataSpelloutFr[] = {
2262             {t_1y, UPRV_LENGTHOF(t_1y), "un\\u00A0an"},
2263             {t_5M, UPRV_LENGTHOF(t_5M), "cinq\\u00A0mois"},
2264             {t_4d, UPRV_LENGTHOF(t_4d), "quatre\\u00A0jours"},
2265             {t_2h, UPRV_LENGTHOF(t_2h), "deux\\u00A0heures"},
2266             {t_19m, UPRV_LENGTHOF(t_19m), "dix-neuf minutes"}};
2267 
2268     Locale en(Locale::getEnglish());
2269     LocalPointer<NumberFormat> nf(NumberFormat::createInstance(en, status));
2270     if (U_FAILURE(status)) {
2271         dataerrln("Error creating number format en object - %s", u_errorName(status));
2272         return;
2273     }
2274     nf->setMaximumFractionDigits(4);
2275     MeasureFormat mf(en, UMEASFMT_WIDTH_WIDE, nf->clone(), status);
2276     if (!assertSuccess("Error creating measure format en WIDE", status)) {
2277         return;
2278     }
2279     verifyFormat("en WIDE", mf, fullData, UPRV_LENGTHOF(fullData));
2280 
2281     // exercise copy constructor
2282     {
2283         MeasureFormat mf2(mf);
2284         verifyFormat("en WIDE copy", mf2, fullData, UPRV_LENGTHOF(fullData));
2285     }
2286     // exercise clone
2287     {
2288         MeasureFormat *mf3 = mf.clone();
2289         verifyFormat("en WIDE copy", *mf3, fullData, UPRV_LENGTHOF(fullData));
2290         delete mf3;
2291     }
2292     mf = MeasureFormat(en, UMEASFMT_WIDTH_SHORT, nf->clone(), status);
2293     if (!assertSuccess("Error creating measure format en SHORT", status)) {
2294         return;
2295     }
2296     verifyFormat("en SHORT", mf, abbrevData, UPRV_LENGTHOF(abbrevData));
2297     mf = MeasureFormat(en, UMEASFMT_WIDTH_NARROW, nf->clone(), status);
2298     if (!assertSuccess("Error creating measure format en NARROW", status)) {
2299         return;
2300     }
2301     verifyFormat("en NARROW", mf, narrowData, UPRV_LENGTHOF(narrowData));
2302     mf = MeasureFormat(en, UMEASFMT_WIDTH_NUMERIC, nf->clone(), status);
2303     if (!assertSuccess("Error creating measure format en NUMERIC", status)) {
2304         return;
2305     }
2306     verifyFormat("en NUMERIC", mf, numericData, UPRV_LENGTHOF(numericData));
2307 
2308     Locale de(Locale::getGerman());
2309     nf.adoptInstead(NumberFormat::createInstance(de, status));
2310     if (!assertSuccess("Error creating number format de object", status)) {
2311         return;
2312     }
2313     nf->setMaximumFractionDigits(4);
2314     mf = MeasureFormat(de, UMEASFMT_WIDTH_WIDE, nf->clone(), status);
2315     if (!assertSuccess("Error creating measure format de WIDE", status)) {
2316         return;
2317     }
2318     verifyFormat("de WIDE", mf, fullDataDe, UPRV_LENGTHOF(fullDataDe));
2319     mf = MeasureFormat(de, UMEASFMT_WIDTH_NUMERIC, nf->clone(), status);
2320     if (!assertSuccess("Error creating measure format de NUMERIC", status)) {
2321         return;
2322     }
2323     verifyFormat("de NUMERIC", mf, numericDataDe, UPRV_LENGTHOF(numericDataDe));
2324 
2325     Locale bengali("bn");
2326     nf.adoptInstead(NumberFormat::createInstance(bengali, status));
2327     if (!assertSuccess("Error creating number format de object", status)) {
2328         return;
2329     }
2330     nf->setMaximumFractionDigits(4);
2331     mf = MeasureFormat(bengali, UMEASFMT_WIDTH_NUMERIC, nf->clone(), status);
2332     if (!assertSuccess("Error creating measure format bn NUMERIC", status)) {
2333         return;
2334     }
2335     verifyFormat("bn NUMERIC", mf, numericDataBn, UPRV_LENGTHOF(numericDataBn));
2336 
2337     Locale bengaliLatin("bn-u-nu-latn");
2338     nf.adoptInstead(NumberFormat::createInstance(bengaliLatin, status));
2339     if (!assertSuccess("Error creating number format de object", status)) {
2340         return;
2341     }
2342     nf->setMaximumFractionDigits(4);
2343     mf = MeasureFormat(bengaliLatin, UMEASFMT_WIDTH_NUMERIC, nf->clone(), status);
2344     if (!assertSuccess("Error creating measure format bn-u-nu-latn NUMERIC", status)) {
2345         return;
2346     }
2347     verifyFormat("bn-u-nu-latn NUMERIC", mf, numericDataBnLatn, UPRV_LENGTHOF(numericDataBnLatn));
2348 
2349     status = U_ZERO_ERROR;
2350     LocalPointer<RuleBasedNumberFormat> rbnf(new RuleBasedNumberFormat(URBNF_SPELLOUT, en, status));
2351     if (U_FAILURE(status)) {
2352         dataerrln("Error creating rbnf en object - %s", u_errorName(status));
2353         return;
2354     }
2355     mf = MeasureFormat(en, UMEASFMT_WIDTH_WIDE, rbnf->clone(), status);
2356     if (!assertSuccess("Error creating measure format en WIDE with rbnf", status)) {
2357         return;
2358     }
2359     verifyFormat("en WIDE rbnf", mf, fullDataSpellout, UPRV_LENGTHOF(fullDataSpellout));
2360 
2361     Locale fr(Locale::getFrench());
2362     LocalPointer<RuleBasedNumberFormat> rbnffr(new RuleBasedNumberFormat(URBNF_SPELLOUT, fr, status));
2363     if (U_FAILURE(status)) {
2364         dataerrln("Error creating rbnf fr object - %s", u_errorName(status));
2365         return;
2366     }
2367     mf = MeasureFormat(fr, UMEASFMT_WIDTH_WIDE, rbnffr->clone(), status);
2368     if (!assertSuccess("Error creating measure format fr WIDE with rbnf", status)) {
2369         return;
2370     }
2371     verifyFormat("fr WIDE rbnf", mf, fullDataSpelloutFr, UPRV_LENGTHOF(fullDataSpellout));
2372 }
2373 
Test10219FractionalPlurals()2374 void MeasureFormatTest::Test10219FractionalPlurals() {
2375     Locale en(Locale::getEnglish());
2376     double values[] = {1.588, 1.011};
2377     const char *expected[2][3] = {
2378             {"1 minute", "1.5 minutes", "1.58 minutes"},
2379             {"1 minute", "1.0 minutes", "1.01 minutes"}
2380     };
2381     UErrorCode status = U_ZERO_ERROR;
2382     for (int j = 0; j < UPRV_LENGTHOF(values); j++) {
2383         for (int i = 0; i < UPRV_LENGTHOF(expected[j]); i++) {
2384             DecimalFormat *df =
2385                 (DecimalFormat *) NumberFormat::createInstance(en, status);
2386             if (U_FAILURE(status)) {
2387                 dataerrln("Error creating Number format - %s", u_errorName(status));
2388                 return;
2389             }
2390             df->setRoundingMode(DecimalFormat::kRoundDown);
2391             df->setMinimumFractionDigits(i);
2392             df->setMaximumFractionDigits(i);
2393             MeasureFormat mf(en, UMEASFMT_WIDTH_WIDE, df, status);
2394             if (!assertSuccess("Error creating Measure format", status)) {
2395                 return;
2396             }
2397             Measure measure(values[j], MeasureUnit::createMinute(status), status);
2398             if (!assertSuccess("Error creating Measure unit", status)) {
2399                 return;
2400             }
2401             verifyFormat("Test10219", mf, &measure, 1, expected[j][i]);
2402         }
2403     }
2404 }
2405 
toMeasureUnit(MeasureUnit * adopted)2406 static MeasureUnit toMeasureUnit(MeasureUnit *adopted) {
2407     MeasureUnit result(*adopted);
2408     delete adopted;
2409     return result;
2410 }
2411 
TestGreek()2412 void MeasureFormatTest::TestGreek() {
2413     Locale locales[] = {Locale("el_GR"), Locale("el")};
2414     UErrorCode status = U_ZERO_ERROR;
2415     MeasureUnit units[] = {
2416         toMeasureUnit(MeasureUnit::createSecond(status)),
2417         toMeasureUnit(MeasureUnit::createMinute(status)),
2418         toMeasureUnit(MeasureUnit::createHour(status)),
2419         toMeasureUnit(MeasureUnit::createDay(status)),
2420         toMeasureUnit(MeasureUnit::createWeek(status)),
2421         toMeasureUnit(MeasureUnit::createMonth(status)),
2422         toMeasureUnit(MeasureUnit::createYear(status))};
2423     if (!assertSuccess("Error creating Measure units", status)) {
2424         return;
2425     }
2426     UMeasureFormatWidth styles[] = {
2427             UMEASFMT_WIDTH_WIDE,
2428             UMEASFMT_WIDTH_SHORT};
2429     int32_t numbers[] = {1, 7};
2430     const char *expected[] = {
2431         // "el_GR" 1 wide
2432         "1 \\u03B4\\u03B5\\u03C5\\u03C4\\u03B5\\u03C1\\u03CC\\u03BB\\u03B5\\u03C0\\u03C4\\u03BF",
2433         "1 \\u03BB\\u03B5\\u03C0\\u03C4\\u03CC",
2434         "1 \\u03CE\\u03C1\\u03B1",
2435         "1 \\u03B7\\u03BC\\u03AD\\u03C1\\u03B1",
2436         "1 \\u03B5\\u03B2\\u03B4\\u03BF\\u03BC\\u03AC\\u03B4\\u03B1",
2437         "1 \\u03BC\\u03AE\\u03BD\\u03B1\\u03C2",
2438         "1 \\u03AD\\u03C4\\u03BF\\u03C2",
2439         // "el_GR" 1 short
2440         "1 \\u03B4\\u03B5\\u03C5\\u03C4.",
2441         "1 \\u03BB\\u03B5\\u03C0.",
2442         "1 \\u03CE\\u03C1\\u03B1",
2443         "1 \\u03B7\\u03BC\\u03AD\\u03C1\\u03B1",
2444         "1 \\u03B5\\u03B2\\u03B4.",
2445         "1 \\u03BC\\u03AE\\u03BD.",
2446         "1 \\u03AD\\u03C4.",            // year (one)
2447         // "el_GR" 7 wide
2448         "7 \\u03B4\\u03B5\\u03C5\\u03C4\\u03B5\\u03C1\\u03CC\\u03BB\\u03B5\\u03C0\\u03C4\\u03B1",
2449         "7 \\u03BB\\u03B5\\u03C0\\u03C4\\u03AC",
2450         "7 \\u03CE\\u03C1\\u03B5\\u03C2",
2451         "7 \\u03B7\\u03BC\\u03AD\\u03C1\\u03B5\\u03C2",
2452         "7 \\u03B5\\u03B2\\u03B4\\u03BF\\u03BC\\u03AC\\u03B4\\u03B5\\u03C2",
2453         "7 \\u03BC\\u03AE\\u03BD\\u03B5\\u03C2",
2454         "7 \\u03AD\\u03C4\\u03B7",
2455         // "el_GR" 7 short
2456         "7 \\u03B4\\u03B5\\u03C5\\u03C4.",
2457         "7 \\u03BB\\u03B5\\u03C0.",
2458         "7 \\u03CE\\u03C1.",            // hour (other)
2459         "7 \\u03B7\\u03BC\\u03AD\\u03C1\\u03B5\\u03C2",
2460         "7 \\u03B5\\u03B2\\u03B4.",
2461         "7 \\u03BC\\u03AE\\u03BD.",
2462         "7 \\u03AD\\u03C4.",            // year (other)
2463 
2464         // "el" 1 wide
2465         "1 \\u03B4\\u03B5\\u03C5\\u03C4\\u03B5\\u03C1\\u03CC\\u03BB\\u03B5\\u03C0\\u03C4\\u03BF",
2466         "1 \\u03BB\\u03B5\\u03C0\\u03C4\\u03CC",
2467         "1 \\u03CE\\u03C1\\u03B1",
2468         "1 \\u03B7\\u03BC\\u03AD\\u03C1\\u03B1",
2469         "1 \\u03B5\\u03B2\\u03B4\\u03BF\\u03BC\\u03AC\\u03B4\\u03B1",
2470         "1 \\u03BC\\u03AE\\u03BD\\u03B1\\u03C2",
2471         "1 \\u03AD\\u03C4\\u03BF\\u03C2",
2472         // "el" 1 short
2473         "1 \\u03B4\\u03B5\\u03C5\\u03C4.",
2474         "1 \\u03BB\\u03B5\\u03C0.",
2475         "1 \\u03CE\\u03C1\\u03B1",
2476         "1 \\u03B7\\u03BC\\u03AD\\u03C1\\u03B1",
2477         "1 \\u03B5\\u03B2\\u03B4.",
2478         "1 \\u03BC\\u03AE\\u03BD.",
2479         "1 \\u03AD\\u03C4.",            // year (one)
2480         // "el" 7 wide
2481         "7 \\u03B4\\u03B5\\u03C5\\u03C4\\u03B5\\u03C1\\u03CC\\u03BB\\u03B5\\u03C0\\u03C4\\u03B1",
2482         "7 \\u03BB\\u03B5\\u03C0\\u03C4\\u03AC",
2483         "7 \\u03CE\\u03C1\\u03B5\\u03C2",
2484         "7 \\u03B7\\u03BC\\u03AD\\u03C1\\u03B5\\u03C2",
2485         "7 \\u03B5\\u03B2\\u03B4\\u03BF\\u03BC\\u03AC\\u03B4\\u03B5\\u03C2",
2486         "7 \\u03BC\\u03AE\\u03BD\\u03B5\\u03C2",
2487         "7 \\u03AD\\u03C4\\u03B7",
2488         // "el" 7 short
2489         "7 \\u03B4\\u03B5\\u03C5\\u03C4.",
2490         "7 \\u03BB\\u03B5\\u03C0.",
2491         "7 \\u03CE\\u03C1.",            // hour (other)
2492         "7 \\u03B7\\u03BC\\u03AD\\u03C1\\u03B5\\u03C2",
2493         "7 \\u03B5\\u03B2\\u03B4.",
2494         "7 \\u03BC\\u03AE\\u03BD.",
2495         "7 \\u03AD\\u03C4."};           // year (other)
2496 
2497     int32_t counter = 0;
2498     for (int32_t locIndex = 0; locIndex < UPRV_LENGTHOF(locales); ++locIndex ) {
2499         for( int32_t numIndex = 0; numIndex < UPRV_LENGTHOF(numbers); ++numIndex ) {
2500             for ( int32_t styleIndex = 0; styleIndex < UPRV_LENGTHOF(styles); ++styleIndex ) {
2501                 for ( int32_t unitIndex = 0; unitIndex < UPRV_LENGTHOF(units); ++unitIndex ) {
2502                     Measure measure(numbers[numIndex], new MeasureUnit(units[unitIndex]), status);
2503                     if (!assertSuccess("Error creating Measure", status)) {
2504                         return;
2505                     }
2506                     MeasureFormat fmt(locales[locIndex], styles[styleIndex], status);
2507                     if (!assertSuccess("Error creating Measure format", status)) {
2508                         return;
2509                     }
2510                     verifyFormat("TestGreek", fmt, &measure, 1, expected[counter]);
2511                     ++counter;
2512                 }
2513             }
2514         }
2515     }
2516 }
2517 
TestFormatSingleArg()2518 void MeasureFormatTest::TestFormatSingleArg() {
2519     UErrorCode status = U_ZERO_ERROR;
2520     MeasureFormat fmt("en", UMEASFMT_WIDTH_WIDE, status);
2521     if (!assertSuccess("Error creating formatter", status)) {
2522         return;
2523     }
2524     UnicodeString buffer;
2525     FieldPosition pos(FieldPosition::DONT_CARE);
2526     fmt.format(
2527             new Measure(3.5, MeasureUnit::createFoot(status), status),
2528             buffer,
2529             pos,
2530             status);
2531     if (!assertSuccess("Error formatting", status)) {
2532         return;
2533     }
2534     assertEquals(
2535             "TestFormatSingleArg",
2536             UnicodeString("3.5 feet"),
2537             buffer);
2538 }
2539 
TestFormatMeasuresZeroArg()2540 void MeasureFormatTest::TestFormatMeasuresZeroArg() {
2541     UErrorCode status = U_ZERO_ERROR;
2542     MeasureFormat fmt("en", UMEASFMT_WIDTH_WIDE, status);
2543     verifyFormat("TestFormatMeasuresZeroArg", fmt, NULL, 0, "");
2544 }
2545 
TestSimplePer()2546 void MeasureFormatTest::TestSimplePer() {
2547     Locale en("en");
2548     UErrorCode status = U_ZERO_ERROR;
2549     LocalPointer<MeasureUnit> second(MeasureUnit::createSecond(status));
2550     LocalPointer<MeasureUnit> minute(MeasureUnit::createMinute(status));
2551     LocalPointer<MeasureUnit> pound(MeasureUnit::createPound(status));
2552     if (!assertSuccess("", status)) {
2553         return;
2554     }
2555 
2556     helperTestSimplePer(
2557             en, UMEASFMT_WIDTH_WIDE,
2558             1.0, *pound, *second, "1 pound per second");
2559     helperTestSimplePer(
2560             en, UMEASFMT_WIDTH_WIDE,
2561             2.0, *pound, *second, "2 pounds per second");
2562     helperTestSimplePer(
2563             en, UMEASFMT_WIDTH_WIDE,
2564             1.0, *pound, *minute, "1 pound per minute");
2565     helperTestSimplePer(
2566             en, UMEASFMT_WIDTH_WIDE,
2567             2.0, *pound, *minute, "2 pounds per minute");
2568 
2569     helperTestSimplePer(
2570             en, UMEASFMT_WIDTH_SHORT, 1.0, *pound, *second, "1 lb/s");
2571     helperTestSimplePer(
2572             en, UMEASFMT_WIDTH_SHORT, 2.0, *pound, *second, "2 lb/s");
2573     helperTestSimplePer(
2574             en, UMEASFMT_WIDTH_SHORT, 1.0, *pound, *minute, "1 lb/min");
2575     helperTestSimplePer(
2576             en, UMEASFMT_WIDTH_SHORT, 2.0, *pound, *minute, "2 lb/min");
2577 
2578     helperTestSimplePer(
2579             en, UMEASFMT_WIDTH_NARROW, 1.0, *pound, *second, "1#/s");
2580     helperTestSimplePer(
2581             en, UMEASFMT_WIDTH_NARROW, 2.0, *pound, *second, "2#/s");
2582     helperTestSimplePer(
2583             en, UMEASFMT_WIDTH_NARROW, 1.0, *pound, *minute, "1#/min");
2584     helperTestSimplePer(
2585             en, UMEASFMT_WIDTH_NARROW, 2.0, *pound, *minute, "2#/min");
2586 
2587     helperTestSimplePer(
2588             en, UMEASFMT_WIDTH_SHORT,
2589             23.3, *pound, *second, "23.3 lb/s",
2590             NumberFormat::kDecimalSeparatorField,
2591             2, 3);
2592 
2593     helperTestSimplePer(
2594             en, UMEASFMT_WIDTH_SHORT,
2595             23.3, *pound, *second, "23.3 lb/s",
2596             NumberFormat::kIntegerField,
2597             0, 2);
2598 
2599     helperTestSimplePer(
2600             en, UMEASFMT_WIDTH_SHORT,
2601             23.3, *pound, *minute, "23.3 lb/min",
2602             NumberFormat::kDecimalSeparatorField,
2603             2, 3);
2604 
2605     helperTestSimplePer(
2606             en, UMEASFMT_WIDTH_SHORT,
2607             23.3, *pound, *minute, "23.3 lb/min",
2608             NumberFormat::kIntegerField,
2609             0, 2);
2610 }
2611 
TestNumeratorPlurals()2612 void MeasureFormatTest::TestNumeratorPlurals() {
2613     Locale pl("pl");
2614     UErrorCode status = U_ZERO_ERROR;
2615     LocalPointer<MeasureUnit> second(MeasureUnit::createSecond(status));
2616     LocalPointer<MeasureUnit> foot(MeasureUnit::createFoot(status));
2617     if (!assertSuccess("", status)) {
2618         return;
2619     }
2620 
2621     helperTestSimplePer(
2622             pl,
2623             UMEASFMT_WIDTH_WIDE,
2624             1.0, *foot, *second, "1 stopa na sekund\\u0119");
2625     helperTestSimplePer(
2626             pl,
2627             UMEASFMT_WIDTH_WIDE,
2628             2.0, *foot, *second, "2 stopy na sekund\\u0119");
2629     helperTestSimplePer(
2630             pl,
2631             UMEASFMT_WIDTH_WIDE,
2632             5.0, *foot, *second, "5 st\\u00f3p na sekund\\u0119");
2633     helperTestSimplePer(
2634             pl, UMEASFMT_WIDTH_WIDE,
2635             1.5, *foot, *second, "1,5 stopy na sekund\\u0119");
2636 }
2637 
helperTestSimplePer(const Locale & locale,UMeasureFormatWidth width,double value,const MeasureUnit & unit,const MeasureUnit & perUnit,const char * expected)2638 void MeasureFormatTest::helperTestSimplePer(
2639         const Locale &locale,
2640         UMeasureFormatWidth width,
2641         double value,
2642         const MeasureUnit &unit,
2643         const MeasureUnit &perUnit,
2644         const char *expected) {
2645     helperTestSimplePer(
2646             locale,
2647             width,
2648             value,
2649             unit,
2650             perUnit,
2651             expected,
2652             FieldPosition::DONT_CARE,
2653             0,
2654             0);
2655 }
2656 
helperTestSimplePer(const Locale & locale,UMeasureFormatWidth width,double value,const MeasureUnit & unit,const MeasureUnit & perUnit,const char * expected,int32_t field,int32_t expected_start,int32_t expected_end)2657 void MeasureFormatTest::helperTestSimplePer(
2658         const Locale &locale,
2659         UMeasureFormatWidth width,
2660         double value,
2661         const MeasureUnit &unit,
2662         const MeasureUnit &perUnit,
2663         const char *expected,
2664         int32_t field,
2665         int32_t expected_start,
2666         int32_t expected_end) {
2667     UErrorCode status = U_ZERO_ERROR;
2668     FieldPosition pos(field);
2669     MeasureFormat fmt(locale, width, status);
2670     if (!assertSuccess("Error creating format object", status)) {
2671         return;
2672     }
2673     Measure measure(value, unit.clone(), status);
2674     if (!assertSuccess("Error creating measure object", status)) {
2675         return;
2676     }
2677     UnicodeString prefix("prefix: ");
2678     UnicodeString buffer(prefix);
2679     fmt.formatMeasurePerUnit(
2680             measure,
2681             perUnit,
2682             buffer,
2683             pos,
2684             status);
2685     if (!assertSuccess("Error formatting measures with per", status)) {
2686         return;
2687     }
2688     UnicodeString uexpected(expected);
2689     uexpected = prefix + uexpected;
2690     assertEquals(
2691             "TestSimplePer",
2692             uexpected.unescape(),
2693             buffer);
2694     if (field != FieldPosition::DONT_CARE) {
2695         assertEquals(
2696                 "Start", expected_start, pos.getBeginIndex() - prefix.length());
2697         assertEquals(
2698                 "End", expected_end, pos.getEndIndex() - prefix.length());
2699     }
2700 }
2701 
TestMultiples()2702 void MeasureFormatTest::TestMultiples() {
2703     Locale ru("ru");
2704     Locale en("en");
2705     helperTestMultiples(en, UMEASFMT_WIDTH_WIDE,   "2 miles, 1 foot, 2.3 inches");
2706     helperTestMultiples(en, UMEASFMT_WIDTH_SHORT,  "2 mi, 1 ft, 2.3 in");
2707     helperTestMultiples(en, UMEASFMT_WIDTH_NARROW, "2mi 1\\u2032 2.3\\u2033");
2708     helperTestMultiples(ru, UMEASFMT_WIDTH_WIDE,   "2 \\u043C\\u0438\\u043B\\u0438 1 \\u0444\\u0443\\u0442 2,3 \\u0434\\u044E\\u0439\\u043C\\u0430");
2709     helperTestMultiples(ru, UMEASFMT_WIDTH_SHORT,  "2 \\u043C\\u0438\\u043B\\u0438 1 \\u0444\\u0442 2,3 \\u0434\\u044E\\u0439\\u043C.");
2710     helperTestMultiples(ru, UMEASFMT_WIDTH_NARROW, "2 \\u043C\\u0438\\u043B\\u044C 1 \\u0444\\u0442 2,3 \\u0434\\u044E\\u0439\\u043C\\u0430");
2711 }
2712 
helperTestMultiples(const Locale & locale,UMeasureFormatWidth width,const char * expected)2713 void MeasureFormatTest::helperTestMultiples(
2714         const Locale &locale,
2715         UMeasureFormatWidth width,
2716         const char *expected) {
2717     UErrorCode status = U_ZERO_ERROR;
2718     FieldPosition pos(FieldPosition::DONT_CARE);
2719     MeasureFormat fmt(locale, width, status);
2720     if (!assertSuccess("Error creating format object", status)) {
2721         return;
2722     }
2723     Measure measures[] = {
2724             Measure(2.0, MeasureUnit::createMile(status), status),
2725             Measure(1.0, MeasureUnit::createFoot(status), status),
2726             Measure(2.3, MeasureUnit::createInch(status), status)};
2727     if (!assertSuccess("Error creating measures", status)) {
2728         return;
2729     }
2730     UnicodeString buffer;
2731     fmt.formatMeasures(measures, UPRV_LENGTHOF(measures), buffer, pos, status);
2732     if (!assertSuccess("Error formatting measures", status)) {
2733         return;
2734     }
2735     assertEquals("TestMultiples", UnicodeString(expected).unescape(), buffer);
2736 }
2737 
TestManyLocaleDurations()2738 void MeasureFormatTest::TestManyLocaleDurations() {
2739     UErrorCode status = U_ZERO_ERROR;
2740     Measure measures[] = {
2741             Measure(5.0, MeasureUnit::createHour(status), status),
2742             Measure(37.0, MeasureUnit::createMinute(status), status)};
2743     if (!assertSuccess("Error creating measures", status)) {
2744         return;
2745     }
2746     helperTestManyLocaleDurations("da", UMEASFMT_WIDTH_NARROW,  measures, UPRV_LENGTHOF(measures), "5 t og 37 m");
2747     helperTestManyLocaleDurations("da", UMEASFMT_WIDTH_NUMERIC, measures, UPRV_LENGTHOF(measures), "5.37");
2748     helperTestManyLocaleDurations("de", UMEASFMT_WIDTH_NARROW,  measures, UPRV_LENGTHOF(measures), "5 Std., 37 Min.");
2749     helperTestManyLocaleDurations("de", UMEASFMT_WIDTH_NUMERIC, measures, UPRV_LENGTHOF(measures), "5:37");
2750     helperTestManyLocaleDurations("en", UMEASFMT_WIDTH_NARROW,  measures, UPRV_LENGTHOF(measures), "5h 37m");
2751     helperTestManyLocaleDurations("en", UMEASFMT_WIDTH_NUMERIC, measures, UPRV_LENGTHOF(measures), "5:37");
2752     helperTestManyLocaleDurations("en_GB", UMEASFMT_WIDTH_NARROW,  measures, UPRV_LENGTHOF(measures), "5h 37m");
2753     helperTestManyLocaleDurations("en_GB", UMEASFMT_WIDTH_NUMERIC, measures, UPRV_LENGTHOF(measures), "5:37");
2754     helperTestManyLocaleDurations("es", UMEASFMT_WIDTH_NARROW,  measures, UPRV_LENGTHOF(measures), "5 h 37 min");
2755     helperTestManyLocaleDurations("es", UMEASFMT_WIDTH_NUMERIC, measures, UPRV_LENGTHOF(measures), "5:37");
2756     helperTestManyLocaleDurations("fi", UMEASFMT_WIDTH_NARROW,  measures, UPRV_LENGTHOF(measures), "5t 37min");
2757     helperTestManyLocaleDurations("fi", UMEASFMT_WIDTH_NUMERIC, measures, UPRV_LENGTHOF(measures), "5.37");
2758     helperTestManyLocaleDurations("fr", UMEASFMT_WIDTH_NARROW,  measures, UPRV_LENGTHOF(measures), "5h 37min");
2759     helperTestManyLocaleDurations("fr", UMEASFMT_WIDTH_NUMERIC, measures, UPRV_LENGTHOF(measures), "5:37");
2760     helperTestManyLocaleDurations("is", UMEASFMT_WIDTH_NARROW,  measures, UPRV_LENGTHOF(measures), "5 klst. og 37 m\\u00EDn.");
2761     helperTestManyLocaleDurations("is", UMEASFMT_WIDTH_NUMERIC, measures, UPRV_LENGTHOF(measures), "5:37");
2762     helperTestManyLocaleDurations("ja", UMEASFMT_WIDTH_NARROW,  measures, UPRV_LENGTHOF(measures), "5h37m");
2763     helperTestManyLocaleDurations("ja", UMEASFMT_WIDTH_NUMERIC, measures, UPRV_LENGTHOF(measures), "5:37");
2764     helperTestManyLocaleDurations("nb", UMEASFMT_WIDTH_NARROW,  measures, UPRV_LENGTHOF(measures), "5t, 37m");
2765     helperTestManyLocaleDurations("nb", UMEASFMT_WIDTH_NUMERIC, measures, UPRV_LENGTHOF(measures), "5:37");
2766     helperTestManyLocaleDurations("nl", UMEASFMT_WIDTH_NARROW,  measures, UPRV_LENGTHOF(measures), "5 u, 37 m");
2767     helperTestManyLocaleDurations("nl", UMEASFMT_WIDTH_NUMERIC, measures, UPRV_LENGTHOF(measures), "5:37");
2768     helperTestManyLocaleDurations("nn", UMEASFMT_WIDTH_NARROW,  measures, UPRV_LENGTHOF(measures), "5t og 37m");
2769     helperTestManyLocaleDurations("nn", UMEASFMT_WIDTH_NUMERIC, measures, UPRV_LENGTHOF(measures), "5:37");
2770     helperTestManyLocaleDurations("sv", UMEASFMT_WIDTH_NARROW,  measures, UPRV_LENGTHOF(measures), "5h 37m");
2771     helperTestManyLocaleDurations("sv", UMEASFMT_WIDTH_NUMERIC, measures, UPRV_LENGTHOF(measures), "5:37");
2772     helperTestManyLocaleDurations("zh", UMEASFMT_WIDTH_NARROW,  measures, UPRV_LENGTHOF(measures), "5\\u5C0F\\u65F637\\u5206\\u949F");
2773     helperTestManyLocaleDurations("zh", UMEASFMT_WIDTH_NUMERIC, measures, UPRV_LENGTHOF(measures), "5:37");
2774 }
2775 
helperTestManyLocaleDurations(const char * localeID,UMeasureFormatWidth width,const Measure * measures,int32_t measureCount,const char * expected)2776 void MeasureFormatTest::helperTestManyLocaleDurations( const char *localeID,
2777                                                        UMeasureFormatWidth width,
2778                                                        const Measure *measures,
2779                                                        int32_t measureCount,
2780                                                        const char *expected) {
2781     UErrorCode status = U_ZERO_ERROR;
2782     MeasureFormat fmt(Locale(localeID), width, status);
2783     if (U_FAILURE(status)) {
2784         errln("Could not create MeasureFormat for locale %s, width %d, status: %s", localeID, (int)width, u_errorName(status));
2785         return;
2786     }
2787     UnicodeString buffer;
2788     FieldPosition pos(FieldPosition::DONT_CARE);
2789     fmt.formatMeasures(measures, measureCount, buffer, pos, status);
2790     if (U_FAILURE(status)) {
2791         errln("MeasureFormat::formatMeasures failed for locale %s, width %d, status: %s", localeID, (int)width, u_errorName(status));
2792         return;
2793     }
2794     UnicodeString expStr(UnicodeString(expected).unescape());
2795     if (buffer != expStr) {
2796         errln("MeasureFormat::formatMeasures for locale " + UnicodeString(localeID) + ", width " + width + ", expected \"" + expStr + "\", got \"" + buffer + "\"");
2797     }
2798 }
2799 
TestGram()2800 void MeasureFormatTest::TestGram() {
2801     UErrorCode status = U_ZERO_ERROR;
2802     MeasureFormat fmt("en", UMEASFMT_WIDTH_SHORT, status);
2803     if (!assertSuccess("Error creating format object", status)) {
2804         return;
2805     }
2806     Measure gram((double)1, MeasureUnit::createGram(status), status);
2807     Measure gforce((double)1, MeasureUnit::createGForce(status), status);
2808     if (!assertSuccess("Error creating measures", status)) {
2809         return;
2810     }
2811     verifyFormat("TestGram", fmt, &gram, 1, "1 g");
2812     verifyFormat("TestGram", fmt, &gforce, 1, "1 G");
2813 }
2814 
TestCurrencies()2815 void MeasureFormatTest::TestCurrencies() {
2816     UChar USD[4] = {};
2817     u_uastrcpy(USD, "USD");
2818     UErrorCode status = U_ZERO_ERROR;
2819     CurrencyUnit USD_unit(USD, status);
2820     assertEquals("Currency Unit", USD, USD_unit.getISOCurrency());
2821     if (!assertSuccess("Error creating CurrencyUnit", status)) {
2822         return;
2823     }
2824     CurrencyAmount USD_1(1.0, USD, status);
2825     assertEquals("Currency Code", USD, USD_1.getISOCurrency());
2826     CurrencyAmount USD_2(2.0, USD, status);
2827     CurrencyAmount USD_NEG_1(-1.0, USD, status);
2828     if (!assertSuccess("Error creating currencies", status)) {
2829         return;
2830     }
2831     Locale en("en");
2832     MeasureFormat fmt(en, UMEASFMT_WIDTH_WIDE, status);
2833     if (!assertSuccess("Error creating format object", status)) {
2834         return;
2835     }
2836     verifyFormat("TestCurrenciesWide", fmt, &USD_NEG_1, 1, "-1.00 US dollars");
2837     verifyFormat("TestCurrenciesWide", fmt, &USD_1, 1, "1.00 US dollars");
2838     verifyFormat("TestCurrenciesWide", fmt, &USD_2, 1, "2.00 US dollars");
2839     fmt = MeasureFormat(en, UMEASFMT_WIDTH_SHORT, status);
2840     if (!assertSuccess("Error creating format object", status)) {
2841         return;
2842     }
2843     verifyFormat("TestCurrenciesShort", fmt, &USD_NEG_1, 1, "-USD\\u00A01.00");
2844     verifyFormat("TestCurrenciesShort", fmt, &USD_1, 1, "USD\\u00A01.00");
2845     verifyFormat("TestCurrenciesShort", fmt, &USD_2, 1, "USD\\u00A02.00");
2846     fmt = MeasureFormat(en, UMEASFMT_WIDTH_NARROW, status);
2847     if (!assertSuccess("Error creating format object", status)) {
2848         return;
2849     }
2850     verifyFormat("TestCurrenciesNarrow", fmt, &USD_NEG_1, 1, "-$1.00");
2851     verifyFormat("TestCurrenciesNarrow", fmt, &USD_1, 1, "$1.00");
2852     verifyFormat("TestCurrenciesNarrow", fmt, &USD_2, 1, "$2.00");
2853     fmt = MeasureFormat(en, UMEASFMT_WIDTH_NUMERIC, status);
2854     if (!assertSuccess("Error creating format object", status)) {
2855         return;
2856     }
2857     verifyFormat("TestCurrenciesNumeric", fmt, &USD_NEG_1, 1, "-$1.00");
2858     verifyFormat("TestCurrenciesNumeric", fmt, &USD_1, 1, "$1.00");
2859     verifyFormat("TestCurrenciesNumeric", fmt, &USD_2, 1, "$2.00");
2860 }
2861 
TestDisplayNames()2862 void MeasureFormatTest::TestDisplayNames() {
2863     UErrorCode status = U_ZERO_ERROR;
2864     helperTestDisplayName( MeasureUnit::createYear(status), "en", UMEASFMT_WIDTH_WIDE, "years" );
2865     helperTestDisplayName( MeasureUnit::createYear(status), "ja", UMEASFMT_WIDTH_WIDE, "\\u5E74" );
2866     helperTestDisplayName( MeasureUnit::createYear(status), "es", UMEASFMT_WIDTH_WIDE, "a\\u00F1os" );
2867     helperTestDisplayName( MeasureUnit::createYear(status), "pt", UMEASFMT_WIDTH_WIDE, "anos" );
2868     helperTestDisplayName( MeasureUnit::createYear(status), "pt-PT", UMEASFMT_WIDTH_WIDE, "anos" );
2869     helperTestDisplayName( MeasureUnit::createAmpere(status), "en", UMEASFMT_WIDTH_WIDE, "amperes" );
2870     helperTestDisplayName( MeasureUnit::createAmpere(status), "ja", UMEASFMT_WIDTH_WIDE, "\\u30A2\\u30F3\\u30DA\\u30A2" );
2871     helperTestDisplayName( MeasureUnit::createAmpere(status), "es", UMEASFMT_WIDTH_WIDE, "amperios" );
2872     helperTestDisplayName( MeasureUnit::createAmpere(status), "pt", UMEASFMT_WIDTH_WIDE, "amperes" );
2873     helperTestDisplayName( MeasureUnit::createAmpere(status), "pt-PT", UMEASFMT_WIDTH_WIDE, "amperes" );
2874     helperTestDisplayName( MeasureUnit::createMeterPerSecondSquared(status), "pt", UMEASFMT_WIDTH_WIDE, "metros por segundo ao quadrado" );
2875     helperTestDisplayName( MeasureUnit::createMeterPerSecondSquared(status), "pt-PT", UMEASFMT_WIDTH_WIDE, "metros por segundo quadrado" );
2876     helperTestDisplayName( MeasureUnit::createSquareKilometer(status), "pt", UMEASFMT_WIDTH_NARROW, "km\\u00B2" );
2877     helperTestDisplayName( MeasureUnit::createSquareKilometer(status), "pt", UMEASFMT_WIDTH_SHORT, "km\\u00B2" );
2878     helperTestDisplayName( MeasureUnit::createSquareKilometer(status), "pt", UMEASFMT_WIDTH_WIDE, "quil\\u00F4metros quadrados" );
2879     helperTestDisplayName( MeasureUnit::createSecond(status), "pt-PT", UMEASFMT_WIDTH_NARROW, "s" );
2880     helperTestDisplayName( MeasureUnit::createSecond(status), "pt-PT", UMEASFMT_WIDTH_SHORT, "s" );
2881     helperTestDisplayName( MeasureUnit::createSecond(status), "pt-PT", UMEASFMT_WIDTH_WIDE, "segundos" );
2882     helperTestDisplayName( MeasureUnit::createSecond(status), "pt", UMEASFMT_WIDTH_NARROW, "seg" );
2883     helperTestDisplayName( MeasureUnit::createSecond(status), "pt", UMEASFMT_WIDTH_SHORT, "seg" );
2884     helperTestDisplayName( MeasureUnit::createSecond(status), "pt", UMEASFMT_WIDTH_WIDE, "segundos" );
2885     assertSuccess("Error creating measure units", status);
2886 }
2887 
helperTestDisplayName(const MeasureUnit * unit,const char * localeID,UMeasureFormatWidth width,const char * expected)2888 void MeasureFormatTest::helperTestDisplayName(const MeasureUnit *unit,
2889                             const char *localeID,
2890                             UMeasureFormatWidth width,
2891                             const char *expected) {
2892     UErrorCode status = U_ZERO_ERROR;
2893     MeasureFormat fmt(Locale(localeID), width, status);
2894     if (U_FAILURE(status)) {
2895         errln("Could not create MeasureFormat for locale %s, width %d, status: %s",
2896             localeID, (int)width, u_errorName(status));
2897         return;
2898     }
2899 
2900     UnicodeString dnam = fmt.getUnitDisplayName(*unit, status);
2901     if (U_FAILURE(status)) {
2902         errln("MeasureFormat::getUnitDisplayName failed for unit %s-%s, locale %s, width %d, status: %s",
2903             unit->getType(), unit->getSubtype(), localeID, (int)width, u_errorName(status));
2904         return;
2905     }
2906 
2907     UnicodeString expStr(UnicodeString(expected).unescape());
2908     if (dnam != expStr) {
2909         errln("MeasureFormat::getUnitDisplayName for unit %s-%s, locale %s, width %d: expected \"%s\", got \"%s\"",
2910             unit->getType(), unit->getSubtype(), localeID, (int)width, CStr(expStr)(), CStr(dnam)());
2911     }
2912 
2913     // Delete the measure unit
2914     delete unit;
2915 }
2916 
TestFieldPosition()2917 void MeasureFormatTest::TestFieldPosition() {
2918     UErrorCode status = U_ZERO_ERROR;
2919     MeasureFormat fmt("en", UMEASFMT_WIDTH_SHORT, status);
2920     if (!assertSuccess("Error creating format object", status)) {
2921         return;
2922     }
2923     Measure measure(43.5, MeasureUnit::createFoot(status), status);
2924     if (!assertSuccess("Error creating measure object 1", status)) {
2925         return;
2926     }
2927     UnicodeString prefix("123456: ");
2928     verifyFieldPosition(
2929             "",
2930             fmt,
2931             prefix,
2932             &measure,
2933             1,
2934             NumberFormat::kDecimalSeparatorField,
2935             10,
2936             11);
2937     measure = Measure(43.0, MeasureUnit::createFoot(status), status);
2938     if (!assertSuccess("Error creating measure object 2", status)) {
2939         return;
2940     }
2941     verifyFieldPosition(
2942             "",
2943             fmt,
2944             prefix,
2945             &measure,
2946             1,
2947             NumberFormat::kDecimalSeparatorField,
2948             0,
2949             0);
2950 }
2951 
TestFieldPositionMultiple()2952 void MeasureFormatTest::TestFieldPositionMultiple() {
2953     UErrorCode status = U_ZERO_ERROR;
2954     MeasureFormat fmt("en", UMEASFMT_WIDTH_SHORT, status);
2955     if (!assertSuccess("Error creating format object", status)) {
2956         return;
2957     }
2958     Measure first[] = {
2959       Measure((double)354, MeasureUnit::createMeter(status), status),
2960       Measure((double)23, MeasureUnit::createCentimeter(status), status)};
2961     Measure second[] = {
2962       Measure((double)354, MeasureUnit::createMeter(status), status),
2963       Measure((double)23, MeasureUnit::createCentimeter(status), status),
2964       Measure((double)5.4, MeasureUnit::createMillimeter(status), status)};
2965     Measure third[] = {
2966       Measure((double)3, MeasureUnit::createMeter(status), status),
2967       Measure((double)23, MeasureUnit::createCentimeter(status), status),
2968       Measure((double)5, MeasureUnit::createMillimeter(status), status)};
2969     if (!assertSuccess("Error creating measure objects", status)) {
2970         return;
2971     }
2972     UnicodeString prefix("123456: ");
2973     verifyFieldPosition(
2974             "Integer",
2975             fmt,
2976             prefix,
2977             first,
2978             UPRV_LENGTHOF(first),
2979             NumberFormat::kIntegerField,
2980             8,
2981             11);
2982     verifyFieldPosition(
2983             "Decimal separator",
2984             fmt,
2985             prefix,
2986             second,
2987             UPRV_LENGTHOF(second),
2988             NumberFormat::kDecimalSeparatorField,
2989             23,
2990             24);
2991     verifyFieldPosition(
2992             "no decimal separator",
2993             fmt,
2994             prefix,
2995             third,
2996             UPRV_LENGTHOF(third),
2997             NumberFormat::kDecimalSeparatorField,
2998             0,
2999             0);
3000 }
3001 
TestBadArg()3002 void MeasureFormatTest::TestBadArg() {
3003     UErrorCode status = U_ZERO_ERROR;
3004     MeasureFormat fmt("en", UMEASFMT_WIDTH_SHORT, status);
3005     if (!assertSuccess("Error creating format object", status)) {
3006         return;
3007     }
3008     FieldPosition pos(FieldPosition::DONT_CARE);
3009     UnicodeString buffer;
3010     fmt.format(
3011             9.3,
3012             buffer,
3013             pos,
3014             status);
3015     if (status != U_ILLEGAL_ARGUMENT_ERROR) {
3016         errln("Expected ILLEGAL_ARGUMENT_ERROR");
3017     }
3018 }
3019 
TestEquality()3020 void MeasureFormatTest::TestEquality() {
3021     UErrorCode status = U_ZERO_ERROR;
3022     NumberFormat* nfeq = NumberFormat::createInstance("en", status);
3023     NumberFormat* nfne = NumberFormat::createInstance("fr", status);
3024     MeasureFormat fmt("en", UMEASFMT_WIDTH_SHORT, status);
3025     MeasureFormat fmtEq2("en", UMEASFMT_WIDTH_SHORT, nfeq, status);
3026     MeasureFormat fmtne1("en", UMEASFMT_WIDTH_WIDE, status);
3027     MeasureFormat fmtne2("fr", UMEASFMT_WIDTH_SHORT, status);
3028     MeasureFormat fmtne3("en", UMEASFMT_WIDTH_SHORT, nfne, status);
3029     if (U_FAILURE(status)) {
3030         dataerrln("Error creating MeasureFormats - %s", u_errorName(status));
3031         return;
3032     }
3033     MeasureFormat fmtEq(fmt);
3034     assertTrue("Equal", fmt == fmtEq);
3035     assertTrue("Equal2", fmt == fmtEq2);
3036     assertFalse("Equal Neg", fmt != fmtEq);
3037     assertTrue("Not Equal 1", fmt != fmtne1);
3038     assertFalse("Not Equal Neg 1", fmt == fmtne1);
3039     assertTrue("Not Equal 2", fmt != fmtne2);
3040     assertTrue("Not Equal 3", fmt != fmtne3);
3041 }
3042 
TestGroupingSeparator()3043 void MeasureFormatTest::TestGroupingSeparator() {
3044     UErrorCode status = U_ZERO_ERROR;
3045     Locale en("en");
3046     MeasureFormat fmt(en, UMEASFMT_WIDTH_SHORT, status);
3047     if (!assertSuccess("Error creating format object", status)) {
3048         return;
3049     }
3050     Measure ms[] = {
3051             Measure((int32_t)INT32_MAX, MeasureUnit::createYear(status), status),
3052             Measure((int32_t)INT32_MIN, MeasureUnit::createMonth(status), status),
3053             Measure(-987.0, MeasureUnit::createDay(status), status),
3054             Measure(1362.0, MeasureUnit::createHour(status), status),
3055             Measure(987.0, MeasureUnit::createMinute(status), status)};
3056     FieldPosition pos(NumberFormat::kGroupingSeparatorField);
3057     UnicodeString appendTo;
3058     fmt.formatMeasures(ms, 5, appendTo, pos, status);
3059     if (!assertSuccess("Error formatting", status)) {
3060         return;
3061     }
3062     assertEquals(
3063             "grouping separator",
3064             "2,147,483,647 yrs, -2,147,483,648 mths, -987 days, 1,362 hr, 987 min",
3065             appendTo);
3066     assertEquals("begin index", 1, pos.getBeginIndex());
3067     assertEquals("end index", 2, pos.getEndIndex());
3068 }
3069 
TestDoubleZero()3070 void MeasureFormatTest::TestDoubleZero() {
3071     UErrorCode status = U_ZERO_ERROR;
3072     Measure measures[] = {
3073         Measure(4.7, MeasureUnit::createHour(status), status),
3074         Measure(23.0, MeasureUnit::createMinute(status), status),
3075         Measure(16.0, MeasureUnit::createSecond(status), status)};
3076     Locale en("en");
3077     NumberFormat *nf = NumberFormat::createInstance(en, status);
3078     MeasureFormat fmt("en", UMEASFMT_WIDTH_WIDE, nf, status);
3079     UnicodeString appendTo;
3080     FieldPosition pos(FieldPosition::DONT_CARE);
3081     if (U_FAILURE(status)) {
3082         dataerrln("Error creating formatter - %s", u_errorName(status));
3083         return;
3084     }
3085     nf->setMinimumFractionDigits(2);
3086     nf->setMaximumFractionDigits(2);
3087     fmt.formatMeasures(measures, UPRV_LENGTHOF(measures), appendTo, pos, status);
3088     if (!assertSuccess("Error formatting", status)) {
3089         return;
3090     }
3091     assertEquals(
3092             "TestDoubleZero",
3093             UnicodeString("4 hours, 23 minutes, 16.00 seconds"),
3094             appendTo);
3095     measures[0] = Measure(-4.7, MeasureUnit::createHour(status), status);
3096     appendTo.remove();
3097     fmt.formatMeasures(measures, UPRV_LENGTHOF(measures), appendTo, pos, status);
3098     if (!assertSuccess("Error formatting", status)) {
3099         return;
3100     }
3101     assertEquals(
3102             "TestDoubleZero",
3103             UnicodeString("-4 hours, 23 minutes, 16.00 seconds"),
3104             appendTo);
3105 }
3106 
TestUnitPerUnitResolution()3107 void MeasureFormatTest::TestUnitPerUnitResolution() {
3108     UErrorCode status = U_ZERO_ERROR;
3109     Locale en("en");
3110     MeasureFormat fmt("en", UMEASFMT_WIDTH_SHORT, status);
3111     Measure measure(50.0, MeasureUnit::createPound(status), status);
3112     LocalPointer<MeasureUnit> sqInch(MeasureUnit::createSquareInch(status));
3113     if (!assertSuccess("Create of format unit and per unit", status)) {
3114         return;
3115     }
3116     FieldPosition pos(FieldPosition::DONT_CARE);
3117     UnicodeString actual;
3118     fmt.formatMeasurePerUnit(
3119             measure,
3120             *sqInch,
3121             actual,
3122             pos,
3123             status);
3124     assertEquals("", "50 psi", actual);
3125 }
3126 
TestIndividualPluralFallback()3127 void MeasureFormatTest::TestIndividualPluralFallback() {
3128     // See ticket #11986 "incomplete fallback in MeasureFormat".
3129     // In CLDR 28, fr_CA temperature-generic/short has only the "one" form,
3130     // and falls back to fr for the "other" form.
3131     IcuTestErrorCode errorCode(*this, "TestIndividualPluralFallback");
3132     MeasureFormat mf("fr_CA", UMEASFMT_WIDTH_SHORT, errorCode);
3133     LocalPointer<Measure> twoDeg(
3134         new Measure(2.0, MeasureUnit::createGenericTemperature(errorCode), errorCode), errorCode);
3135     UnicodeString expected = UNICODE_STRING_SIMPLE("2\\u00B0").unescape();
3136     UnicodeString actual;
3137     assertEquals("2 deg temp in fr_CA", expected, mf.format(twoDeg.orphan(), actual, errorCode), TRUE);
3138 }
3139 
Test20332_PersonUnits()3140 void MeasureFormatTest::Test20332_PersonUnits() {
3141     IcuTestErrorCode status(*this, "Test20332_PersonUnits");
3142     const struct TestCase {
3143         const char* locale;
3144         MeasureUnit* unitToAdopt;
3145         UMeasureFormatWidth width;
3146         const char* expected;
3147     } cases[] = {
3148         {"en-us", MeasureUnit::createYearPerson(status), UMEASFMT_WIDTH_NARROW, "25y"},
3149         {"en-us", MeasureUnit::createYearPerson(status), UMEASFMT_WIDTH_SHORT, "25 yrs"},
3150         {"en-us", MeasureUnit::createYearPerson(status), UMEASFMT_WIDTH_WIDE, "25 years"},
3151         {"en-us", MeasureUnit::createMonthPerson(status), UMEASFMT_WIDTH_NARROW, "25m"},
3152         {"en-us", MeasureUnit::createMonthPerson(status), UMEASFMT_WIDTH_SHORT, "25 mths"},
3153         {"en-us", MeasureUnit::createMonthPerson(status), UMEASFMT_WIDTH_WIDE, "25 months"},
3154         {"en-us", MeasureUnit::createWeekPerson(status), UMEASFMT_WIDTH_NARROW, "25w"},
3155         {"en-us", MeasureUnit::createWeekPerson(status), UMEASFMT_WIDTH_SHORT, "25 wks"},
3156         {"en-us", MeasureUnit::createWeekPerson(status), UMEASFMT_WIDTH_WIDE, "25 weeks"},
3157         {"en-us", MeasureUnit::createDayPerson(status), UMEASFMT_WIDTH_NARROW, "25d"},
3158         {"en-us", MeasureUnit::createDayPerson(status), UMEASFMT_WIDTH_SHORT, "25 days"},
3159         {"en-us", MeasureUnit::createDayPerson(status), UMEASFMT_WIDTH_WIDE, "25 days"}
3160     };
3161     for (const auto& cas : cases) {
3162         MeasureFormat mf(cas.locale, cas.width, status);
3163         if (status.errIfFailureAndReset()) { return; }
3164         Measure measure(25, cas.unitToAdopt, status);
3165         if (status.errIfFailureAndReset()) { return; }
3166         verifyFormat(cas.locale, mf, &measure, 1, cas.expected);
3167     }
3168 }
3169 
TestNumericTime()3170 void MeasureFormatTest::TestNumericTime() {
3171     IcuTestErrorCode status(*this, "TestNumericTime");
3172 
3173     MeasureFormat fmt("en", UMEASFMT_WIDTH_NUMERIC, status);
3174 
3175     Measure hours(112, MeasureUnit::createHour(status), status);
3176     Measure minutes(113, MeasureUnit::createMinute(status), status);
3177     Measure seconds(114, MeasureUnit::createSecond(status), status);
3178     Measure fhours(112.8765, MeasureUnit::createHour(status), status);
3179     Measure fminutes(113.8765, MeasureUnit::createMinute(status), status);
3180     Measure fseconds(114.8765, MeasureUnit::createSecond(status), status);
3181     if (status.errDataIfFailureAndReset(WHERE)) return;
3182 
3183     verifyFormat("hours", fmt, &hours, 1, "112h");
3184     verifyFormat("minutes", fmt, &minutes, 1, "113m");
3185     verifyFormat("seconds", fmt, &seconds, 1, "114s");
3186 
3187     verifyFormat("fhours", fmt, &fhours, 1, "112.876h");
3188     verifyFormat("fminutes", fmt, &fminutes, 1, "113.876m");
3189     verifyFormat("fseconds", fmt, &fseconds, 1, "114.876s");
3190 
3191     Measure hoursMinutes[2] = {hours, minutes};
3192     verifyFormat("hoursMinutes", fmt, hoursMinutes, 2, "112:113");
3193     Measure hoursSeconds[2] = {hours, seconds};
3194     verifyFormat("hoursSeconds", fmt, hoursSeconds, 2, "112:00:114");
3195     Measure minutesSeconds[2] = {minutes, seconds};
3196     verifyFormat("minutesSeconds", fmt, minutesSeconds, 2, "113:114");
3197 
3198     Measure hoursFminutes[2] = {hours, fminutes};
3199     verifyFormat("hoursFminutes", fmt, hoursFminutes, 2, "112:113.876");
3200     Measure hoursFseconds[2] = {hours, fseconds};
3201     verifyFormat("hoursFseconds", fmt, hoursFseconds, 2, "112:00:114.876");
3202     Measure minutesFseconds[2] = {minutes, fseconds};
3203     verifyFormat("hoursMminutesFsecondsinutes", fmt, minutesFseconds, 2, "113:114.876");
3204 
3205     Measure fhoursMinutes[2] = {fhours, minutes};
3206     verifyFormat("fhoursMinutes", fmt, fhoursMinutes, 2, "112:113");
3207     Measure fhoursSeconds[2] = {fhours, seconds};
3208     verifyFormat("fhoursSeconds", fmt, fhoursSeconds, 2, "112:00:114");
3209     Measure fminutesSeconds[2] = {fminutes, seconds};
3210     verifyFormat("fminutesSeconds", fmt, fminutesSeconds, 2, "113:114");
3211 
3212     Measure fhoursFminutes[2] = {fhours, fminutes};
3213     verifyFormat("fhoursFminutes", fmt, fhoursFminutes, 2, "112:113.876");
3214     Measure fhoursFseconds[2] = {fhours, fseconds};
3215     verifyFormat("fhoursFseconds", fmt, fhoursFseconds, 2, "112:00:114.876");
3216     Measure fminutesFseconds[2] = {fminutes, fseconds};
3217     verifyFormat("fminutesFseconds", fmt, fminutesFseconds, 2, "113:114.876");
3218 
3219     Measure hoursMinutesSeconds[3] = {hours, minutes, seconds};
3220     verifyFormat("hoursMinutesSeconds", fmt, hoursMinutesSeconds, 3, "112:113:114");
3221     Measure fhoursFminutesFseconds[3] = {fhours, fminutes, fseconds};
3222     verifyFormat("fhoursFminutesFseconds", fmt, fhoursFminutesFseconds, 3, "112:113:114.876");
3223 }
3224 
TestNumericTimeSomeSpecialFormats()3225 void MeasureFormatTest::TestNumericTimeSomeSpecialFormats() {
3226     IcuTestErrorCode status(*this, "TestNumericTimeSomeSpecialFormats");
3227 
3228     Measure fhours(2.8765432, MeasureUnit::createHour(status), status);
3229     Measure fminutes(3.8765432, MeasureUnit::createMinute(status), status);
3230     if (status.errDataIfFailureAndReset(WHERE)) return;
3231 
3232     Measure fhoursFminutes[2] = {fhours, fminutes};
3233 
3234     // Latvian is one of the very few locales 0-padding the hour
3235     MeasureFormat fmtLt("lt", UMEASFMT_WIDTH_NUMERIC, status);
3236     if (status.errDataIfFailureAndReset(WHERE)) return;
3237     verifyFormat("Latvian fhoursFminutes", fmtLt, fhoursFminutes, 2, "02:03,877");
3238 
3239     // Danish is one of the very few locales using '.' as separator
3240     MeasureFormat fmtDa("da", UMEASFMT_WIDTH_NUMERIC, status);
3241     verifyFormat("Danish fhoursFminutes", fmtDa, fhoursFminutes, 2, "2.03,877");
3242 }
3243 
TestIdentifiers()3244 void MeasureFormatTest::TestIdentifiers() {
3245     IcuTestErrorCode status(*this, "TestIdentifiers");
3246     struct TestCase {
3247         const char* id;
3248         const char* normalized;
3249     } cases[] = {
3250         // Correctly normalized identifiers should not change
3251         {"", ""},
3252         {"square-meter-per-square-meter", "square-meter-per-square-meter"},
3253         {"kilogram-meter-per-square-meter-square-second",
3254          "kilogram-meter-per-square-meter-square-second"},
3255         {"square-mile-and-square-foot", "square-mile-and-square-foot"},
3256         {"square-foot-and-square-mile", "square-foot-and-square-mile"},
3257         {"per-cubic-centimeter", "per-cubic-centimeter"},
3258         {"per-kilometer", "per-kilometer"},
3259 
3260         // Normalization of power and per
3261         {"p2-foot-and-p2-mile", "square-foot-and-square-mile"},
3262         {"gram-square-gram-per-dekagram", "cubic-gram-per-dekagram"},
3263         {"kilogram-per-meter-per-second", "kilogram-per-meter-second"},
3264 
3265         // TODO(ICU-20920): Add more test cases once the proper ranking is available.
3266     };
3267     for (const auto &cas : cases) {
3268         status.setScope(cas.id);
3269         MeasureUnit unit = MeasureUnit::forIdentifier(cas.id, status);
3270         status.errIfFailureAndReset();
3271         const char* actual = unit.getIdentifier();
3272         assertEquals(cas.id, cas.normalized, actual);
3273         status.errIfFailureAndReset();
3274     }
3275 }
3276 
TestInvalidIdentifiers()3277 void MeasureFormatTest::TestInvalidIdentifiers() {
3278     IcuTestErrorCode status(*this, "TestInvalidIdentifiers");
3279 
3280     const char *const inputs[] = {
3281         "kilo",
3282         "kilokilo",
3283         "onekilo",
3284         "meterkilo",
3285         "meter-kilo",
3286         "k",
3287         "meter-",
3288         "meter+",
3289         "-meter",
3290         "+meter",
3291         "-kilometer",
3292         "+kilometer",
3293         "-p2-meter",
3294         "+p2-meter",
3295         "+",
3296         "-",
3297         "-mile",
3298         "-and-mile",
3299         "-per-mile",
3300         "one",
3301         "one-one",
3302         "one-per-mile",
3303         "one-per-cubic-centimeter",
3304         "square--per-meter",
3305         "metersecond", // Must have compound part in between single units
3306 
3307         // Negative powers not supported in mixed units yet. TODO(CLDR-13701).
3308         "per-hour-and-hertz",
3309         "hertz-and-per-hour",
3310 
3311         // Compound units not supported in mixed units yet. TODO(CLDR-13700).
3312         "kilonewton-meter-and-newton-meter",
3313     };
3314 
3315     for (const auto& input : inputs) {
3316         status.setScope(input);
3317         MeasureUnit::forIdentifier(input, status);
3318         status.expectErrorAndReset(U_ILLEGAL_ARGUMENT_ERROR);
3319     }
3320 }
3321 
TestCompoundUnitOperations()3322 void MeasureFormatTest::TestCompoundUnitOperations() {
3323     IcuTestErrorCode status(*this, "TestCompoundUnitOperations");
3324 
3325     MeasureUnit::forIdentifier("kilometer-per-second-joule", status);
3326 
3327     MeasureUnit kilometer = MeasureUnit::getKilometer();
3328     MeasureUnit cubicMeter = MeasureUnit::getCubicMeter();
3329     MeasureUnit meter = kilometer.withSIPrefix(UMEASURE_SI_PREFIX_ONE, status);
3330     MeasureUnit centimeter1 = kilometer.withSIPrefix(UMEASURE_SI_PREFIX_CENTI, status);
3331     MeasureUnit centimeter2 = meter.withSIPrefix(UMEASURE_SI_PREFIX_CENTI, status);
3332     MeasureUnit cubicDecimeter = cubicMeter.withSIPrefix(UMEASURE_SI_PREFIX_DECI, status);
3333 
3334     verifySingleUnit(kilometer, UMEASURE_SI_PREFIX_KILO, 1, "kilometer");
3335     verifySingleUnit(meter, UMEASURE_SI_PREFIX_ONE, 1, "meter");
3336     verifySingleUnit(centimeter1, UMEASURE_SI_PREFIX_CENTI, 1, "centimeter");
3337     verifySingleUnit(centimeter2, UMEASURE_SI_PREFIX_CENTI, 1, "centimeter");
3338     verifySingleUnit(cubicDecimeter, UMEASURE_SI_PREFIX_DECI, 3, "cubic-decimeter");
3339 
3340     assertTrue("centimeter equality", centimeter1 == centimeter2);
3341     assertTrue("kilometer inequality", centimeter1 != kilometer);
3342 
3343     MeasureUnit squareMeter = meter.withDimensionality(2, status);
3344     MeasureUnit overCubicCentimeter = centimeter1.withDimensionality(-3, status);
3345     MeasureUnit quarticKilometer = kilometer.withDimensionality(4, status);
3346     MeasureUnit overQuarticKilometer1 = kilometer.withDimensionality(-4, status);
3347 
3348     verifySingleUnit(squareMeter, UMEASURE_SI_PREFIX_ONE, 2, "square-meter");
3349     verifySingleUnit(overCubicCentimeter, UMEASURE_SI_PREFIX_CENTI, -3, "per-cubic-centimeter");
3350     verifySingleUnit(quarticKilometer, UMEASURE_SI_PREFIX_KILO, 4, "p4-kilometer");
3351     verifySingleUnit(overQuarticKilometer1, UMEASURE_SI_PREFIX_KILO, -4, "per-p4-kilometer");
3352 
3353     assertTrue("power inequality", quarticKilometer != overQuarticKilometer1);
3354 
3355     MeasureUnit overQuarticKilometer2 = quarticKilometer.reciprocal(status);
3356     MeasureUnit overQuarticKilometer3 = kilometer.product(kilometer, status)
3357         .product(kilometer, status)
3358         .product(kilometer, status)
3359         .reciprocal(status);
3360     MeasureUnit overQuarticKilometer4 = meter.withDimensionality(4, status)
3361         .reciprocal(status)
3362         .withSIPrefix(UMEASURE_SI_PREFIX_KILO, status);
3363 
3364     verifySingleUnit(overQuarticKilometer2, UMEASURE_SI_PREFIX_KILO, -4, "per-p4-kilometer");
3365     verifySingleUnit(overQuarticKilometer3, UMEASURE_SI_PREFIX_KILO, -4, "per-p4-kilometer");
3366     verifySingleUnit(overQuarticKilometer4, UMEASURE_SI_PREFIX_KILO, -4, "per-p4-kilometer");
3367 
3368     assertTrue("reciprocal equality", overQuarticKilometer1 == overQuarticKilometer2);
3369     assertTrue("reciprocal equality", overQuarticKilometer1 == overQuarticKilometer3);
3370     assertTrue("reciprocal equality", overQuarticKilometer1 == overQuarticKilometer4);
3371 
3372     MeasureUnit kiloSquareSecond = MeasureUnit::getSecond()
3373         .withDimensionality(2, status).withSIPrefix(UMEASURE_SI_PREFIX_KILO, status);
3374     MeasureUnit meterSecond = meter.product(kiloSquareSecond, status);
3375     MeasureUnit cubicMeterSecond1 = meter.withDimensionality(3, status).product(kiloSquareSecond, status);
3376     MeasureUnit centimeterSecond1 = meter.withSIPrefix(UMEASURE_SI_PREFIX_CENTI, status).product(kiloSquareSecond, status);
3377     MeasureUnit secondCubicMeter = kiloSquareSecond.product(meter.withDimensionality(3, status), status);
3378     MeasureUnit secondCentimeter = kiloSquareSecond.product(meter.withSIPrefix(UMEASURE_SI_PREFIX_CENTI, status), status);
3379     MeasureUnit secondCentimeterPerKilometer = secondCentimeter.product(kilometer.reciprocal(status), status);
3380 
3381     verifySingleUnit(kiloSquareSecond, UMEASURE_SI_PREFIX_KILO, 2, "square-kilosecond");
3382     const char* meterSecondSub[] = {"meter", "square-kilosecond"};
3383     verifyCompoundUnit(meterSecond, "meter-square-kilosecond",
3384         meterSecondSub, UPRV_LENGTHOF(meterSecondSub));
3385     const char* cubicMeterSecond1Sub[] = {"cubic-meter", "square-kilosecond"};
3386     verifyCompoundUnit(cubicMeterSecond1, "cubic-meter-square-kilosecond",
3387         cubicMeterSecond1Sub, UPRV_LENGTHOF(cubicMeterSecond1Sub));
3388     const char* centimeterSecond1Sub[] = {"centimeter", "square-kilosecond"};
3389     verifyCompoundUnit(centimeterSecond1, "centimeter-square-kilosecond",
3390         centimeterSecond1Sub, UPRV_LENGTHOF(centimeterSecond1Sub));
3391     const char* secondCubicMeterSub[] = {"cubic-meter", "square-kilosecond"};
3392     verifyCompoundUnit(secondCubicMeter, "cubic-meter-square-kilosecond",
3393         secondCubicMeterSub, UPRV_LENGTHOF(secondCubicMeterSub));
3394     const char* secondCentimeterSub[] = {"centimeter", "square-kilosecond"};
3395     verifyCompoundUnit(secondCentimeter, "centimeter-square-kilosecond",
3396         secondCentimeterSub, UPRV_LENGTHOF(secondCentimeterSub));
3397     const char* secondCentimeterPerKilometerSub[] = {"centimeter", "square-kilosecond", "per-kilometer"};
3398     verifyCompoundUnit(secondCentimeterPerKilometer, "centimeter-square-kilosecond-per-kilometer",
3399         secondCentimeterPerKilometerSub, UPRV_LENGTHOF(secondCentimeterPerKilometerSub));
3400 
3401     assertTrue("reordering equality", cubicMeterSecond1 == secondCubicMeter);
3402     assertTrue("additional simple units inequality", secondCubicMeter != secondCentimeter);
3403 
3404     // Don't allow get/set power or SI prefix on compound units
3405     status.errIfFailureAndReset();
3406     meterSecond.getDimensionality(status);
3407     status.expectErrorAndReset(U_ILLEGAL_ARGUMENT_ERROR);
3408     meterSecond.withDimensionality(3, status);
3409     status.expectErrorAndReset(U_ILLEGAL_ARGUMENT_ERROR);
3410     meterSecond.getSIPrefix(status);
3411     status.expectErrorAndReset(U_ILLEGAL_ARGUMENT_ERROR);
3412     meterSecond.withSIPrefix(UMEASURE_SI_PREFIX_CENTI, status);
3413     status.expectErrorAndReset(U_ILLEGAL_ARGUMENT_ERROR);
3414 
3415     // Test that StringPiece does not overflow
3416     MeasureUnit centimeter3 = MeasureUnit::forIdentifier({secondCentimeter.getIdentifier(), 10}, status);
3417     verifySingleUnit(centimeter3, UMEASURE_SI_PREFIX_CENTI, 1, "centimeter");
3418     assertTrue("string piece equality", centimeter1 == centimeter3);
3419 
3420     MeasureUnit footInch = MeasureUnit::forIdentifier("foot-and-inch", status);
3421     MeasureUnit inchFoot = MeasureUnit::forIdentifier("inch-and-foot", status);
3422 
3423     const char* footInchSub[] = {"foot", "inch"};
3424     verifyMixedUnit(footInch, "foot-and-inch",
3425         footInchSub, UPRV_LENGTHOF(footInchSub));
3426     const char* inchFootSub[] = {"inch", "foot"};
3427     verifyMixedUnit(inchFoot, "inch-and-foot",
3428         inchFootSub, UPRV_LENGTHOF(inchFootSub));
3429 
3430     assertTrue("order matters inequality", footInch != inchFoot);
3431 
3432     MeasureUnit dimensionless;
3433     MeasureUnit dimensionless2 = MeasureUnit::forIdentifier("", status);
3434     status.errIfFailureAndReset("Dimensionless MeasureUnit.");
3435     assertTrue("dimensionless equality", dimensionless == dimensionless2);
3436 
3437     // We support starting from an "identity" MeasureUnit and then combining it
3438     // with others via product:
3439     MeasureUnit kilometer2 = dimensionless.product(kilometer, status);
3440     status.errIfFailureAndReset("dimensionless.product(kilometer, status)");
3441     verifySingleUnit(kilometer2, UMEASURE_SI_PREFIX_KILO, 1, "kilometer");
3442     assertTrue("kilometer equality", kilometer == kilometer2);
3443 
3444     // Test out-of-range powers
3445     MeasureUnit power15 = MeasureUnit::forIdentifier("p15-kilometer", status);
3446     verifySingleUnit(power15, UMEASURE_SI_PREFIX_KILO, 15, "p15-kilometer");
3447     status.errIfFailureAndReset();
3448     MeasureUnit power16a = MeasureUnit::forIdentifier("p16-kilometer", status);
3449     status.expectErrorAndReset(U_ILLEGAL_ARGUMENT_ERROR);
3450     MeasureUnit power16b = power15.product(kilometer, status);
3451     status.expectErrorAndReset(U_ILLEGAL_ARGUMENT_ERROR);
3452     MeasureUnit powerN15 = MeasureUnit::forIdentifier("per-p15-kilometer", status);
3453     verifySingleUnit(powerN15, UMEASURE_SI_PREFIX_KILO, -15, "per-p15-kilometer");
3454     status.errIfFailureAndReset();
3455     MeasureUnit powerN16a = MeasureUnit::forIdentifier("per-p16-kilometer", status);
3456     status.expectErrorAndReset(U_ILLEGAL_ARGUMENT_ERROR);
3457     MeasureUnit powerN16b = powerN15.product(overQuarticKilometer1, status);
3458     status.expectErrorAndReset(U_ILLEGAL_ARGUMENT_ERROR);
3459 }
3460 
TestDimensionlessBehaviour()3461 void MeasureFormatTest::TestDimensionlessBehaviour() {
3462     IcuTestErrorCode status(*this, "TestDimensionlessBehaviour");
3463     MeasureUnit dimensionless;
3464     MeasureUnit modified;
3465 
3466     // At the time of writing, each of the seven groups below caused
3467     // Parser::from("") to be called:
3468 
3469     // splitToSingleUnits
3470     int32_t count;
3471     LocalArray<MeasureUnit> singles = dimensionless.splitToSingleUnits(count, status);
3472     status.errIfFailureAndReset("dimensionless.splitToSingleUnits(...)");
3473     assertEquals("no singles in dimensionless", 0, count);
3474 
3475     // product(dimensionless)
3476     MeasureUnit mile = MeasureUnit::getMile();
3477     mile = mile.product(dimensionless, status);
3478     status.errIfFailureAndReset("mile.product(dimensionless, ...)");
3479     verifySingleUnit(mile, UMEASURE_SI_PREFIX_ONE, 1, "mile");
3480 
3481     // dimensionless.getSIPrefix()
3482     UMeasureSIPrefix siPrefix = dimensionless.getSIPrefix(status);
3483     status.errIfFailureAndReset("dimensionless.getSIPrefix(...)");
3484     assertEquals("dimensionless SIPrefix", UMEASURE_SI_PREFIX_ONE, siPrefix);
3485 
3486     // dimensionless.withSIPrefix()
3487     modified = dimensionless.withSIPrefix(UMEASURE_SI_PREFIX_KILO, status);
3488     status.errIfFailureAndReset("dimensionless.withSIPrefix(...)");
3489     singles = modified.splitToSingleUnits(count, status);
3490     assertEquals("no singles in modified", 0, count);
3491     siPrefix = modified.getSIPrefix(status);
3492     status.errIfFailureAndReset("modified.getSIPrefix(...)");
3493     assertEquals("modified SIPrefix", UMEASURE_SI_PREFIX_ONE, siPrefix);
3494 
3495     // dimensionless.getComplexity()
3496     UMeasureUnitComplexity complexity = dimensionless.getComplexity(status);
3497     status.errIfFailureAndReset("dimensionless.getComplexity(...)");
3498     assertEquals("dimensionless complexity", UMEASURE_UNIT_SINGLE, complexity);
3499 
3500     // Dimensionality is mostly meaningless for dimensionless units, but it's
3501     // still considered a SINGLE unit, so this code doesn't throw errors:
3502 
3503     // dimensionless.getDimensionality()
3504     int32_t dimensionality = dimensionless.getDimensionality(status);
3505     status.errIfFailureAndReset("dimensionless.getDimensionality(...)");
3506     assertEquals("dimensionless dimensionality", 0, dimensionality);
3507 
3508     // dimensionless.withDimensionality()
3509     dimensionless.withDimensionality(-1, status);
3510     status.errIfFailureAndReset("dimensionless.withDimensionality(...)");
3511     dimensionality = dimensionless.getDimensionality(status);
3512     status.errIfFailureAndReset("dimensionless.getDimensionality(...)");
3513     assertEquals("dimensionless dimensionality", 0, dimensionality);
3514 }
3515 
3516 // ICU-21060
Test21060_AddressSanitizerProblem()3517 void MeasureFormatTest::Test21060_AddressSanitizerProblem() {
3518     IcuTestErrorCode status(*this, "Test21060_AddressSanitizerProblem");
3519 
3520     MeasureUnit first = MeasureUnit::forIdentifier("", status);
3521     status.errIfFailureAndReset();
3522 
3523     // Experimentally, a compound unit like "kilogram-meter" failed. A single
3524     // unit like "kilogram" or "meter" did not fail, did not trigger the
3525     // problem.
3526     MeasureUnit crux = MeasureUnit::forIdentifier("per-meter", status);
3527 
3528     // Heap allocation of a new CharString for first.identifier happens here:
3529     first = first.product(crux, status);
3530 
3531     // Constructing second from first's identifier resulted in a failure later,
3532     // as second held a reference to a substring of first's identifier:
3533     MeasureUnit second = MeasureUnit::forIdentifier(first.getIdentifier(), status);
3534 
3535     // Heap is freed here, as an old first.identifier CharString is deallocated
3536     // and a new CharString is allocated:
3537     first = first.product(crux, status);
3538 
3539     // Proving we've had no failure yet:
3540     status.errIfFailureAndReset();
3541 
3542     // heap-use-after-free failure happened here, since a SingleUnitImpl had
3543     // held onto a StringPiece pointing at a substring of an identifier that was
3544     // freed above:
3545     second = second.product(crux, status);
3546 
3547     status.errIfFailureAndReset();
3548 }
3549 
3550 
verifyFieldPosition(const char * description,const MeasureFormat & fmt,const UnicodeString & prefix,const Measure * measures,int32_t measureCount,NumberFormat::EAlignmentFields field,int32_t start,int32_t end)3551 void MeasureFormatTest::verifyFieldPosition(
3552         const char *description,
3553         const MeasureFormat &fmt,
3554         const UnicodeString &prefix,
3555         const Measure *measures,
3556         int32_t measureCount,
3557         NumberFormat::EAlignmentFields field,
3558         int32_t start,
3559         int32_t end) {
3560     // 8 char lead
3561     UnicodeString result(prefix);
3562     FieldPosition pos(field);
3563     UErrorCode status = U_ZERO_ERROR;
3564     CharString ch;
3565     const char *descPrefix = ch.append(description, status)
3566             .append(": ", status).data();
3567     CharString beginIndex;
3568     beginIndex.append(descPrefix, status).append("beginIndex", status);
3569     CharString endIndex;
3570     endIndex.append(descPrefix, status).append("endIndex", status);
3571     fmt.formatMeasures(measures, measureCount, result, pos, status);
3572     if (!assertSuccess("Error formatting", status)) {
3573         return;
3574     }
3575     assertEquals(beginIndex.data(), start, pos.getBeginIndex());
3576     assertEquals(endIndex.data(), end, pos.getEndIndex());
3577 }
3578 
verifyFormat(const char * description,const MeasureFormat & fmt,const Measure * measures,int32_t measureCount,const char * expected)3579 void MeasureFormatTest::verifyFormat(
3580         const char *description,
3581         const MeasureFormat &fmt,
3582         const Measure *measures,
3583         int32_t measureCount,
3584         const char *expected) {
3585     verifyFormatWithPrefix(
3586             description,
3587             fmt,
3588             "",
3589             measures,
3590             measureCount,
3591             expected);
3592 }
3593 
verifyFormatWithPrefix(const char * description,const MeasureFormat & fmt,const UnicodeString & prefix,const Measure * measures,int32_t measureCount,const char * expected)3594 void MeasureFormatTest::verifyFormatWithPrefix(
3595         const char *description,
3596         const MeasureFormat &fmt,
3597         const UnicodeString &prefix,
3598         const Measure *measures,
3599         int32_t measureCount,
3600         const char *expected) {
3601     UnicodeString result(prefix);
3602     FieldPosition pos(FieldPosition::DONT_CARE);
3603     UErrorCode status = U_ZERO_ERROR;
3604     fmt.formatMeasures(measures, measureCount, result, pos, status);
3605     if (!assertSuccess("Error formatting", status)) {
3606         return;
3607     }
3608     assertEquals(description, ctou(expected), result);
3609 }
3610 
verifyFormat(const char * description,const MeasureFormat & fmt,const ExpectedResult * expectedResults,int32_t count)3611 void MeasureFormatTest::verifyFormat(
3612         const char *description,
3613         const MeasureFormat &fmt,
3614         const ExpectedResult *expectedResults,
3615         int32_t count) {
3616     for (int32_t i = 0; i < count; ++i) {
3617         verifyFormat(description, fmt, expectedResults[i].measures, expectedResults[i].count, expectedResults[i].expected);
3618     }
3619 }
3620 
verifySingleUnit(const MeasureUnit & unit,UMeasureSIPrefix siPrefix,int8_t power,const char * identifier)3621 void MeasureFormatTest::verifySingleUnit(
3622         const MeasureUnit& unit,
3623         UMeasureSIPrefix siPrefix,
3624         int8_t power,
3625         const char* identifier) {
3626     IcuTestErrorCode status(*this, "verifySingleUnit");
3627     UnicodeString uid(identifier, -1, US_INV);
3628     assertEquals(uid + ": SI prefix",
3629         siPrefix,
3630         unit.getSIPrefix(status));
3631     status.errIfFailureAndReset("%s: SI prefix", identifier);
3632     assertEquals(uid + ": Power",
3633         static_cast<int32_t>(power),
3634         static_cast<int32_t>(unit.getDimensionality(status)));
3635     status.errIfFailureAndReset("%s: Power", identifier);
3636     assertEquals(uid + ": Identifier",
3637         identifier,
3638         unit.getIdentifier());
3639     status.errIfFailureAndReset("%s: Identifier", identifier);
3640     assertTrue(uid + ": Constructor",
3641         unit == MeasureUnit::forIdentifier(identifier, status));
3642     status.errIfFailureAndReset("%s: Constructor", identifier);
3643     assertEquals(uid + ": Complexity",
3644         UMEASURE_UNIT_SINGLE,
3645         unit.getComplexity(status));
3646     status.errIfFailureAndReset("%s: Complexity", identifier);
3647 }
3648 
verifyCompoundUnit(const MeasureUnit & unit,const char * identifier,const char ** subIdentifiers,int32_t subIdentifierCount)3649 void MeasureFormatTest::verifyCompoundUnit(
3650         const MeasureUnit& unit,
3651         const char* identifier,
3652         const char** subIdentifiers,
3653         int32_t subIdentifierCount) {
3654     IcuTestErrorCode status(*this, "verifyCompoundUnit");
3655     UnicodeString uid(identifier, -1, US_INV);
3656     assertEquals(uid + ": Identifier",
3657         identifier,
3658         unit.getIdentifier());
3659     status.errIfFailureAndReset("%s: Identifier", identifier);
3660     assertTrue(uid + ": Constructor",
3661         unit == MeasureUnit::forIdentifier(identifier, status));
3662     status.errIfFailureAndReset("%s: Constructor", identifier);
3663     assertEquals(uid + ": Complexity",
3664         UMEASURE_UNIT_COMPOUND,
3665         unit.getComplexity(status));
3666     status.errIfFailureAndReset("%s: Complexity", identifier);
3667 
3668     int32_t length;
3669     LocalArray<MeasureUnit> subUnits = unit.splitToSingleUnits(length, status);
3670     assertEquals(uid + ": Length", subIdentifierCount, length);
3671     for (int32_t i = 0;; i++) {
3672         if (i >= subIdentifierCount || i >= length) break;
3673         assertEquals(uid + ": Sub-unit #" + Int64ToUnicodeString(i),
3674             subIdentifiers[i],
3675             subUnits[i].getIdentifier());
3676         assertEquals(uid + ": Sub-unit Complexity",
3677             UMEASURE_UNIT_SINGLE,
3678             subUnits[i].getComplexity(status));
3679     }
3680 }
3681 
verifyMixedUnit(const MeasureUnit & unit,const char * identifier,const char ** subIdentifiers,int32_t subIdentifierCount)3682 void MeasureFormatTest::verifyMixedUnit(
3683         const MeasureUnit& unit,
3684         const char* identifier,
3685         const char** subIdentifiers,
3686         int32_t subIdentifierCount) {
3687     IcuTestErrorCode status(*this, "verifyMixedUnit");
3688     UnicodeString uid(identifier, -1, US_INV);
3689     assertEquals(uid + ": Identifier",
3690         identifier,
3691         unit.getIdentifier());
3692     status.errIfFailureAndReset("%s: Identifier", identifier);
3693     assertTrue(uid + ": Constructor",
3694         unit == MeasureUnit::forIdentifier(identifier, status));
3695     status.errIfFailureAndReset("%s: Constructor", identifier);
3696     assertEquals(uid + ": Complexity",
3697         UMEASURE_UNIT_MIXED,
3698         unit.getComplexity(status));
3699     status.errIfFailureAndReset("%s: Complexity", identifier);
3700 
3701     int32_t length;
3702     LocalArray<MeasureUnit> subUnits = unit.splitToSingleUnits(length, status);
3703     assertEquals(uid + ": Length", subIdentifierCount, length);
3704     for (int32_t i = 0;; i++) {
3705         if (i >= subIdentifierCount || i >= length) break;
3706         assertEquals(uid + ": Sub-unit #" + Int64ToUnicodeString(i),
3707             subIdentifiers[i],
3708             subUnits[i].getIdentifier());
3709     }
3710 }
3711 
createMeasureFormatTest()3712 extern IntlTest *createMeasureFormatTest() {
3713     return new MeasureFormatTest();
3714 }
3715 
3716 #endif
3717 
3718