2 *******************************************************************************
3 * Copyright (C) 2014, International Business Machines Corporation and *
4 * others. All Rights Reserved. *
5 *******************************************************************************
9 *******************************************************************************
16 #if !UCONFIG_NO_FORMATTING
18 #include "unicode/decimfmt.h"
19 #include "unicode/measfmt.h"
20 #include "unicode/measure.h"
21 #include "unicode/measunit.h"
22 #include "unicode/tmunit.h"
25 #define LENGTHOF(array) (int32_t)(sizeof(array) / sizeof((array)[0]))
27 struct ExpectedResult
{
28 const Measure
*measures
;
33 class MeasureFormatTest
: public IntlTest
{
38 void runIndexedTest(int32_t index
, UBool exec
, const char *&name
, char *par
=0);
41 void TestGetAvailable();
42 void TestExamplesInDocs();
43 void TestFormatPeriodEn();
44 void Test10219FractionalPlurals();
46 void TestFormatSingleArg();
47 void TestFormatMeasuresZeroArg();
50 void TestCurrencies();
51 void TestFieldPosition();
52 void TestFieldPositionMultiple();
55 void TestDoubleZero();
57 const char *description
,
58 const MeasureFormat
&fmt
,
59 const Measure
*measures
,
61 const char *expected
);
62 void verifyFormatWithPrefix(
63 const char *description
,
64 const MeasureFormat
&fmt
,
65 const UnicodeString
&prefix
,
66 const Measure
*measures
,
68 const char *expected
);
70 const char *description
,
71 const MeasureFormat
&fmt
,
72 const ExpectedResult
*expectedResults
,
74 void helperTestMultiples(
76 UMeasureFormatWidth width
,
77 const char *expected
);
78 void verifyFieldPosition(
79 const char *description
,
80 const MeasureFormat
&fmt
,
81 const UnicodeString
&prefix
,
82 const Measure
*measures
,
84 NumberFormat::EAlignmentFields field
,
89 void MeasureFormatTest::runIndexedTest(
90 int32_t index
, UBool exec
, const char *&name
, char *) {
92 logln("TestSuite MeasureFormatTest: ");
95 TESTCASE_AUTO(TestBasic
);
96 TESTCASE_AUTO(TestGetAvailable
);
97 TESTCASE_AUTO(TestExamplesInDocs
);
98 TESTCASE_AUTO(TestFormatPeriodEn
);
99 TESTCASE_AUTO(Test10219FractionalPlurals
);
100 TESTCASE_AUTO(TestGreek
);
101 TESTCASE_AUTO(TestFormatSingleArg
);
102 TESTCASE_AUTO(TestFormatMeasuresZeroArg
);
103 TESTCASE_AUTO(TestMultiples
);
104 TESTCASE_AUTO(TestGram
);
105 TESTCASE_AUTO(TestCurrencies
);
106 TESTCASE_AUTO(TestFieldPosition
);
107 TESTCASE_AUTO(TestFieldPositionMultiple
);
108 TESTCASE_AUTO(TestBadArg
);
109 TESTCASE_AUTO(TestEquality
);
110 TESTCASE_AUTO(TestDoubleZero
);
114 void MeasureFormatTest::TestBasic() {
115 UErrorCode status
= U_ZERO_ERROR
;
116 MeasureUnit
*ptr1
= MeasureUnit::createArcMinute(status
);
117 MeasureUnit
*ptr2
= MeasureUnit::createArcMinute(status
);
118 if (!(*ptr1
== *ptr2
)) {
119 errln("Expect == to work.");
121 if (*ptr1
!= *ptr2
) {
122 errln("Expect != to work.");
124 MeasureUnit
*ptr3
= MeasureUnit::createMeter(status
);
125 if (*ptr1
== *ptr3
) {
126 errln("Expect == to work.");
128 if (!(*ptr1
!= *ptr3
)) {
129 errln("Expect != to work.");
131 MeasureUnit
*ptr4
= (MeasureUnit
*) ptr1
->clone();
132 if (*ptr1
!= *ptr4
) {
133 errln("Expect clone to work.");
137 if (*ptr1
!= stack
) {
138 errln("Expect assignment to work.");
147 void MeasureFormatTest::TestGetAvailable() {
148 MeasureUnit
*units
= NULL
;
149 UErrorCode status
= U_ZERO_ERROR
;
150 int32_t totalCount
= MeasureUnit::getAvailable(units
, 0, status
);
151 while (status
== U_BUFFER_OVERFLOW_ERROR
) {
152 status
= U_ZERO_ERROR
;
154 units
= new MeasureUnit
[totalCount
];
155 totalCount
= MeasureUnit::getAvailable(units
, totalCount
, status
);
157 if (U_FAILURE(status
)) {
158 dataerrln("Failure creating format object - %s", u_errorName(status
));
162 if (totalCount
< 200) {
163 errln("Expect at least 200 measure units including currencies.");
166 StringEnumeration
*types
= MeasureUnit::getAvailableTypes(status
);
167 if (U_FAILURE(status
)) {
168 dataerrln("Failure getting types - %s", u_errorName(status
));
172 if (types
->count(status
) < 10) {
173 errln("Expect at least 10 distinct unit types.");
176 int32_t unitCapacity
= 0;
177 int32_t unitCountSum
= 0;
179 const char* type
= types
->next(NULL
, status
);
181 type
= types
->next(NULL
, status
)) {
182 int32_t unitCount
= MeasureUnit::getAvailable(type
, units
, unitCapacity
, status
);
183 while (status
== U_BUFFER_OVERFLOW_ERROR
) {
184 status
= U_ZERO_ERROR
;
186 units
= new MeasureUnit
[unitCount
];
187 unitCapacity
= unitCount
;
188 unitCount
= MeasureUnit::getAvailable(type
, units
, unitCapacity
, status
);
190 if (U_FAILURE(status
)) {
191 dataerrln("Failure getting units - %s", u_errorName(status
));
197 errln("Expect at least one unit count per type.");
199 unitCountSum
+= unitCount
;
201 if (unitCountSum
!= totalCount
) {
202 errln("Expected total unit count to equal sum of unit counts by type.");
208 void MeasureFormatTest::TestExamplesInDocs() {
209 UErrorCode status
= U_ZERO_ERROR
;
210 MeasureFormat
fmtFr(Locale::getFrench(), UMEASFMT_WIDTH_SHORT
, status
);
211 MeasureFormat
fmtFrFull(
212 Locale::getFrench(), UMEASFMT_WIDTH_WIDE
, status
);
213 MeasureFormat
fmtFrNarrow(
214 Locale::getFrench(), UMEASFMT_WIDTH_NARROW
, status
);
215 MeasureFormat
fmtEn(Locale::getUS(), UMEASFMT_WIDTH_WIDE
, status
);
216 if (!assertSuccess("Error creating formatters", status
)) {
219 Measure
measureC(23, MeasureUnit::createCelsius(status
), status
);
220 Measure
measureF(70, MeasureUnit::createFahrenheit(status
), status
);
221 Measure feetAndInches
[] = {
222 Measure(70, MeasureUnit::createFoot(status
), status
),
223 Measure(5.3, MeasureUnit::createInch(status
), status
)};
224 Measure footAndInch
[] = {
225 Measure(1, MeasureUnit::createFoot(status
), status
),
226 Measure(1, MeasureUnit::createInch(status
), status
)};
227 Measure inchAndFeet
[] = {
228 Measure(1, MeasureUnit::createInch(status
), status
),
229 Measure(2, MeasureUnit::createFoot(status
), status
)};
230 if (!assertSuccess("Error creating measurements.", status
)) {
239 verifyFormatWithPrefix(
245 "Prefix: 23 \\u00B0C");
256 LENGTHOF(feetAndInches
),
257 "70 pieds et 5,3 pouces");
258 verifyFormatWithPrefix(
263 LENGTHOF(feetAndInches
),
264 "Prefix: 70 pieds et 5,3 pouces");
269 LENGTHOF(footAndInch
),
270 "1 pied et 1 pouce");
272 "Foot and inch narrow",
275 LENGTHOF(footAndInch
),
276 "1\\u2032 1\\u2033");
281 LENGTHOF(inchAndFeet
),
285 void MeasureFormatTest::TestFormatPeriodEn() {
286 UErrorCode status
= U_ZERO_ERROR
;
287 Measure t_19m
[] = {Measure(19, MeasureUnit::createMinute(status
), status
)};
288 Measure t_1h_23_5s
[] = {
289 Measure(1.0, MeasureUnit::createHour(status
), status
),
290 Measure(23.5, MeasureUnit::createSecond(status
), status
)
292 Measure t_1h_23_5m
[] = {
293 Measure(1.0, MeasureUnit::createHour(status
), status
),
294 Measure(23.5, MeasureUnit::createMinute(status
), status
)
296 Measure t_1h_0m_23s
[] = {
299 TimeUnit::createInstance(
300 TimeUnit::UTIMEUNIT_HOUR
, status
),
304 TimeUnit::createInstance(
305 TimeUnit::UTIMEUNIT_MINUTE
, status
),
309 TimeUnit::createInstance(
310 TimeUnit::UTIMEUNIT_SECOND
, status
),
313 Measure t_2y_5M_3w_4d
[] = {
314 Measure(2.0, MeasureUnit::createYear(status
), status
),
315 Measure(5.0, MeasureUnit::createMonth(status
), status
),
316 Measure(3.0, MeasureUnit::createWeek(status
), status
),
317 Measure(4.0, MeasureUnit::createDay(status
), status
)
319 Measure t_1m_59_9996s
[] = {
320 Measure(1.0, MeasureUnit::createMinute(status
), status
),
321 Measure(59.9996, MeasureUnit::createSecond(status
), status
)
323 Measure t_5h_17m
[] = {
324 Measure(5.0, MeasureUnit::createHour(status
), status
),
325 Measure(17.0, MeasureUnit::createMinute(status
), status
)
327 Measure t_neg5h_17m
[] = {
328 Measure(-5.0, MeasureUnit::createHour(status
), status
),
329 Measure(17.0, MeasureUnit::createMinute(status
), status
)
331 Measure t_19m_28s
[] = {
332 Measure(19.0, MeasureUnit::createMinute(status
), status
),
333 Measure(28.0, MeasureUnit::createSecond(status
), status
)
335 Measure t_0h_0m_9s
[] = {
336 Measure(0.0, MeasureUnit::createHour(status
), status
),
337 Measure(0.0, MeasureUnit::createMinute(status
), status
),
338 Measure(9.0, MeasureUnit::createSecond(status
), status
)
340 Measure t_0h_0m_17s
[] = {
341 Measure(0.0, MeasureUnit::createHour(status
), status
),
342 Measure(0.0, MeasureUnit::createMinute(status
), status
),
343 Measure(17.0, MeasureUnit::createSecond(status
), status
)
345 Measure t_6h_56_92m
[] = {
346 Measure(6.0, MeasureUnit::createHour(status
), status
),
347 Measure(56.92, MeasureUnit::createMinute(status
), status
)
349 Measure t_3h_4s_5m
[] = {
350 Measure(3.0, MeasureUnit::createHour(status
), status
),
351 Measure(4.0, MeasureUnit::createSecond(status
), status
),
352 Measure(5.0, MeasureUnit::createMinute(status
), status
)
354 Measure t_6_7h_56_92m
[] = {
355 Measure(6.7, MeasureUnit::createHour(status
), status
),
356 Measure(56.92, MeasureUnit::createMinute(status
), status
)
359 Measure t_3h_5h
[] = {
360 Measure(3.0, MeasureUnit::createHour(status
), status
),
361 Measure(5.0, MeasureUnit::createHour(status
), status
)
364 if (!assertSuccess("Error creating Measure objects", status
)) {
368 ExpectedResult fullData
[] = {
369 {t_1m_59_9996s
, LENGTHOF(t_1m_59_9996s
), "1 minute, 59.9996 seconds"},
370 {t_19m
, LENGTHOF(t_19m
), "19 minutes"},
371 {t_1h_23_5s
, LENGTHOF(t_1h_23_5s
), "1 hour, 23.5 seconds"},
372 {t_1h_23_5m
, LENGTHOF(t_1h_23_5m
), "1 hour, 23.5 minutes"},
373 {t_1h_0m_23s
, LENGTHOF(t_1h_0m_23s
), "1 hour, 0 minutes, 23 seconds"},
374 {t_2y_5M_3w_4d
, LENGTHOF(t_2y_5M_3w_4d
), "2 years, 5 months, 3 weeks, 4 days"}};
376 ExpectedResult abbrevData
[] = {
377 {t_1m_59_9996s
, LENGTHOF(t_1m_59_9996s
), "1 min, 59.9996 secs"},
378 {t_19m
, LENGTHOF(t_19m
), "19 min"},
379 {t_1h_23_5s
, LENGTHOF(t_1h_23_5s
), "1 hr, 23.5 secs"},
380 {t_1h_23_5m
, LENGTHOF(t_1h_23_5m
), "1 hr, 23.5 min"},
381 {t_1h_0m_23s
, LENGTHOF(t_1h_0m_23s
), "1 hr, 0 min, 23 secs"},
382 {t_2y_5M_3w_4d
, LENGTHOF(t_2y_5M_3w_4d
), "2 yrs, 5 mths, 3 wks, 4 days"}};
384 ExpectedResult narrowData
[] = {
385 {t_1m_59_9996s
, LENGTHOF(t_1m_59_9996s
), "1m 59.9996s"},
386 {t_19m
, LENGTHOF(t_19m
), "19m"},
387 {t_1h_23_5s
, LENGTHOF(t_1h_23_5s
), "1h 23.5s"},
388 {t_1h_23_5m
, LENGTHOF(t_1h_23_5m
), "1h 23.5m"},
389 {t_1h_0m_23s
, LENGTHOF(t_1h_0m_23s
), "1h 0m 23s"},
390 {t_2y_5M_3w_4d
, LENGTHOF(t_2y_5M_3w_4d
), "2y 5m 3w 4d"}};
392 ExpectedResult numericData
[] = {
393 {t_1m_59_9996s
, LENGTHOF(t_1m_59_9996s
), "1:59.9996"},
394 {t_19m
, LENGTHOF(t_19m
), "19m"},
395 {t_1h_23_5s
, LENGTHOF(t_1h_23_5s
), "1:00:23.5"},
396 {t_1h_23_5m
, LENGTHOF(t_1h_23_5m
), "1:23.5"},
397 {t_1h_0m_23s
, LENGTHOF(t_1h_0m_23s
), "1:00:23"},
398 {t_5h_17m
, LENGTHOF(t_5h_17m
), "5:17"},
399 {t_neg5h_17m
, LENGTHOF(t_neg5h_17m
), "-5h 17m"},
400 {t_19m_28s
, LENGTHOF(t_19m_28s
), "19:28"},
401 {t_2y_5M_3w_4d
, LENGTHOF(t_2y_5M_3w_4d
), "2y 5m 3w 4d"},
402 {t_0h_0m_9s
, LENGTHOF(t_0h_0m_9s
), "0:00:09"},
403 {t_6h_56_92m
, LENGTHOF(t_6h_56_92m
), "6:56.92"},
404 {t_6_7h_56_92m
, LENGTHOF(t_6_7h_56_92m
), "6:56.92"},
405 {t_3h_4s_5m
, LENGTHOF(t_3h_4s_5m
), "3h 4s 5m"},
406 {t_3h_5h
, LENGTHOF(t_3h_5h
), "3h 5h"}};
408 ExpectedResult fullDataDe
[] = {
409 {t_1m_59_9996s
, LENGTHOF(t_1m_59_9996s
), "1 Minute und 59,9996 Sekunden"},
410 {t_19m
, LENGTHOF(t_19m
), "19 Minuten"},
411 {t_1h_23_5s
, LENGTHOF(t_1h_23_5s
), "1 Stunde und 23,5 Sekunden"},
412 {t_1h_23_5m
, LENGTHOF(t_1h_23_5m
), "1 Stunde und 23,5 Minuten"},
413 {t_1h_0m_23s
, LENGTHOF(t_1h_0m_23s
), "1 Stunde, 0 Minuten und 23 Sekunden"},
414 {t_2y_5M_3w_4d
, LENGTHOF(t_2y_5M_3w_4d
), "2 Jahre, 5 Monate, 3 Wochen und 4 Tage"}};
416 ExpectedResult numericDataDe
[] = {
417 {t_1m_59_9996s
, LENGTHOF(t_1m_59_9996s
), "1:59,9996"},
418 {t_19m
, LENGTHOF(t_19m
), "19 Min."},
419 {t_1h_23_5s
, LENGTHOF(t_1h_23_5s
), "1:00:23,5"},
420 {t_1h_23_5m
, LENGTHOF(t_1h_23_5m
), "1:23,5"},
421 {t_1h_0m_23s
, LENGTHOF(t_1h_0m_23s
), "1:00:23"},
422 {t_5h_17m
, LENGTHOF(t_5h_17m
), "5:17"},
423 {t_19m_28s
, LENGTHOF(t_19m_28s
), "19:28"},
424 {t_2y_5M_3w_4d
, LENGTHOF(t_2y_5M_3w_4d
), "2 J, 5 M, 3 W und 4 T"},
425 {t_0h_0m_17s
, LENGTHOF(t_0h_0m_17s
), "0:00:17"},
426 {t_6h_56_92m
, LENGTHOF(t_6h_56_92m
), "6:56,92"},
427 {t_3h_5h
, LENGTHOF(t_3h_5h
), "3 Std., 5 Std."}};
429 Locale
en(Locale::getEnglish());
430 LocalPointer
<NumberFormat
> nf(NumberFormat::createInstance(en
, status
));
431 if (U_FAILURE(status
)) {
432 dataerrln("Error creating number format en object - %s", u_errorName(status
));
435 nf
->setMaximumFractionDigits(4);
436 MeasureFormat
mf(en
, UMEASFMT_WIDTH_WIDE
, (NumberFormat
*) nf
->clone(), status
);
437 if (!assertSuccess("Error creating measure format en WIDE", status
)) {
440 verifyFormat("en WIDE", mf
, fullData
, LENGTHOF(fullData
));
442 // exercise copy constructor
444 MeasureFormat
mf2(mf
);
445 verifyFormat("en WIDE copy", mf2
, fullData
, LENGTHOF(fullData
));
449 MeasureFormat
*mf3
= (MeasureFormat
*) mf
.clone();
450 verifyFormat("en WIDE copy", *mf3
, fullData
, LENGTHOF(fullData
));
453 mf
= MeasureFormat(en
, UMEASFMT_WIDTH_SHORT
, (NumberFormat
*) nf
->clone(), status
);
454 if (!assertSuccess("Error creating measure format en SHORT", status
)) {
457 verifyFormat("en SHORT", mf
, abbrevData
, LENGTHOF(abbrevData
));
458 mf
= MeasureFormat(en
, UMEASFMT_WIDTH_NARROW
, (NumberFormat
*) nf
->clone(), status
);
459 if (!assertSuccess("Error creating measure format en NARROW", status
)) {
462 verifyFormat("en NARROW", mf
, narrowData
, LENGTHOF(narrowData
));
463 mf
= MeasureFormat(en
, UMEASFMT_WIDTH_NUMERIC
, (NumberFormat
*) nf
->clone(), status
);
464 if (!assertSuccess("Error creating measure format en NUMERIC", status
)) {
467 verifyFormat("en NUMERIC", mf
, numericData
, LENGTHOF(numericData
));
469 Locale
de(Locale::getGerman());
470 nf
.adoptInstead(NumberFormat::createInstance(de
, status
));
471 if (!assertSuccess("Error creating number format de object", status
)) {
474 nf
->setMaximumFractionDigits(4);
475 mf
= MeasureFormat(de
, UMEASFMT_WIDTH_WIDE
, (NumberFormat
*) nf
->clone(), status
);
476 if (!assertSuccess("Error creating measure format de WIDE", status
)) {
479 verifyFormat("de WIDE", mf
, fullDataDe
, LENGTHOF(fullDataDe
));
480 mf
= MeasureFormat(de
, UMEASFMT_WIDTH_NUMERIC
, (NumberFormat
*) nf
->clone(), status
);
481 if (!assertSuccess("Error creating measure format de NUMERIC", status
)) {
484 verifyFormat("de NUMERIC", mf
, numericDataDe
, LENGTHOF(numericDataDe
));
487 void MeasureFormatTest::Test10219FractionalPlurals() {
488 Locale
en(Locale::getEnglish());
489 double values
[] = {1.588, 1.011};
490 const char *expected
[2][3] = {
491 {"1 minute", "1.5 minutes", "1.58 minutes"},
492 {"1 minute", "1.0 minutes", "1.01 minutes"}
494 UErrorCode status
= U_ZERO_ERROR
;
495 for (int j
= 0; j
< LENGTHOF(values
); j
++) {
496 for (int i
= 0; i
< LENGTHOF(expected
[j
]); i
++) {
498 (DecimalFormat
*) NumberFormat::createInstance(en
, status
);
499 if (U_FAILURE(status
)) {
500 dataerrln("Error creating Number format - %s", u_errorName(status
));
503 df
->setRoundingMode(DecimalFormat::kRoundDown
);
504 df
->setMinimumFractionDigits(i
);
505 df
->setMaximumFractionDigits(i
);
506 MeasureFormat
mf(en
, UMEASFMT_WIDTH_WIDE
, df
, status
);
507 if (!assertSuccess("Error creating Measure format", status
)) {
510 Measure
measure(values
[j
], MeasureUnit::createMinute(status
), status
);
511 if (!assertSuccess("Error creating Measure unit", status
)) {
514 verifyFormat("Test10219", mf
, &measure
, 1, expected
[j
][i
]);
519 static MeasureUnit
toMeasureUnit(MeasureUnit
*adopted
) {
520 MeasureUnit
result(*adopted
);
525 void MeasureFormatTest::TestGreek() {
526 Locale locales
[] = {Locale("el_GR"), Locale("el")};
527 UErrorCode status
= U_ZERO_ERROR
;
528 MeasureUnit units
[] = {
529 toMeasureUnit(MeasureUnit::createSecond(status
)),
530 toMeasureUnit(MeasureUnit::createMinute(status
)),
531 toMeasureUnit(MeasureUnit::createHour(status
)),
532 toMeasureUnit(MeasureUnit::createDay(status
)),
533 toMeasureUnit(MeasureUnit::createWeek(status
)),
534 toMeasureUnit(MeasureUnit::createMonth(status
)),
535 toMeasureUnit(MeasureUnit::createYear(status
))};
536 if (!assertSuccess("Error creating Measure units", status
)) {
539 UMeasureFormatWidth styles
[] = {
541 UMEASFMT_WIDTH_SHORT
};
542 int32_t numbers
[] = {1, 7};
543 const char *expected
[] = {
544 "1 \\u03B4\\u03B5\\u03C5\\u03C4\\u03B5\\u03C1\\u03CC\\u03BB\\u03B5\\u03C0\\u03C4\\u03BF",
545 "1 \\u03BB\\u03B5\\u03C0\\u03C4\\u03CC",
546 "1 \\u03CE\\u03C1\\u03B1",
547 "1 \\u03B7\\u03BC\\u03AD\\u03C1\\u03B1",
548 "1 \\u03B5\\u03B2\\u03B4\\u03BF\\u03BC\\u03AC\\u03B4\\u03B1",
549 "1 \\u03BC\\u03AE\\u03BD\\u03B1\\u03C2",
550 "1 \\u03AD\\u03C4\\u03BF\\u03C2",
551 "1 \\u03B4\\u03B5\\u03C5\\u03C4.",
552 "1 \\u03BB\\u03B5\\u03C0.",
553 "1 \\u03CE\\u03C1\\u03B1",
554 "1 \\u03B7\\u03BC\\u03AD\\u03C1\\u03B1",
555 "1 \\u03B5\\u03B2\\u03B4.",
556 "1 \\u03BC\\u03AE\\u03BD.",
557 "1 \\u03AD\\u03C4\\u03BF\\u03C2",
558 "7 \\u03B4\\u03B5\\u03C5\\u03C4\\u03B5\\u03C1\\u03CC\\u03BB\\u03B5\\u03C0\\u03C4\\u03B1",
559 "7 \\u03BB\\u03B5\\u03C0\\u03C4\\u03AC",
560 "7 \\u03CE\\u03C1\\u03B5\\u03C2",
561 "7 \\u03B7\\u03BC\\u03AD\\u03C1\\u03B5\\u03C2",
562 "7 \\u03B5\\u03B2\\u03B4\\u03BF\\u03BC\\u03AC\\u03B4\\u03B5\\u03C2",
563 "7 \\u03BC\\u03AE\\u03BD\\u03B5\\u03C2",
564 "7 \\u03AD\\u03C4\\u03B7",
565 "7 \\u03B4\\u03B5\\u03C5\\u03C4.",
566 "7 \\u03BB\\u03B5\\u03C0.",
567 "7 \\u03CE\\u03C1\\u03B5\\u03C2",
568 "7 \\u03B7\\u03BC\\u03AD\\u03C1\\u03B5\\u03C2",
569 "7 \\u03B5\\u03B2\\u03B4.",
570 "7 \\u03BC\\u03AE\\u03BD.",
571 "7 \\u03AD\\u03C4\\u03B7",
572 "1 \\u03B4\\u03B5\\u03C5\\u03C4\\u03B5\\u03C1\\u03CC\\u03BB\\u03B5\\u03C0\\u03C4\\u03BF",
573 "1 \\u03BB\\u03B5\\u03C0\\u03C4\\u03CC",
574 "1 \\u03CE\\u03C1\\u03B1",
575 "1 \\u03B7\\u03BC\\u03AD\\u03C1\\u03B1",
576 "1 \\u03B5\\u03B2\\u03B4\\u03BF\\u03BC\\u03AC\\u03B4\\u03B1",
577 "1 \\u03BC\\u03AE\\u03BD\\u03B1\\u03C2",
578 "1 \\u03AD\\u03C4\\u03BF\\u03C2",
579 "1 \\u03B4\\u03B5\\u03C5\\u03C4.",
580 "1 \\u03BB\\u03B5\\u03C0.",
581 "1 \\u03CE\\u03C1\\u03B1",
582 "1 \\u03B7\\u03BC\\u03AD\\u03C1\\u03B1",
583 "1 \\u03B5\\u03B2\\u03B4.",
584 "1 \\u03BC\\u03AE\\u03BD.",
585 "1 \\u03AD\\u03C4\\u03BF\\u03C2",
586 "7 \\u03B4\\u03B5\\u03C5\\u03C4\\u03B5\\u03C1\\u03CC\\u03BB\\u03B5\\u03C0\\u03C4\\u03B1",
587 "7 \\u03BB\\u03B5\\u03C0\\u03C4\\u03AC",
588 "7 \\u03CE\\u03C1\\u03B5\\u03C2",
589 "7 \\u03B7\\u03BC\\u03AD\\u03C1\\u03B5\\u03C2",
590 "7 \\u03B5\\u03B2\\u03B4\\u03BF\\u03BC\\u03AC\\u03B4\\u03B5\\u03C2",
591 "7 \\u03BC\\u03AE\\u03BD\\u03B5\\u03C2",
592 "7 \\u03AD\\u03C4\\u03B7",
593 "7 \\u03B4\\u03B5\\u03C5\\u03C4.",
594 "7 \\u03BB\\u03B5\\u03C0.",
595 "7 \\u03CE\\u03C1\\u03B5\\u03C2",
596 "7 \\u03B7\\u03BC\\u03AD\\u03C1\\u03B5\\u03C2",
597 "7 \\u03B5\\u03B2\\u03B4.",
598 "7 \\u03BC\\u03AE\\u03BD.",
599 "7 \\u03AD\\u03C4\\u03B7"};
602 for (int32_t locIndex
= 0; locIndex
< LENGTHOF(locales
); ++locIndex
) {
603 for( int32_t numIndex
= 0; numIndex
< LENGTHOF(numbers
); ++numIndex
) {
604 for ( int32_t styleIndex
= 0; styleIndex
< LENGTHOF(styles
); ++styleIndex
) {
605 for ( int32_t unitIndex
= 0; unitIndex
< LENGTHOF(units
); ++unitIndex
) {
606 Measure
measure(numbers
[numIndex
], new MeasureUnit(units
[unitIndex
]), status
);
607 if (!assertSuccess("Error creating Measure", status
)) {
610 MeasureFormat
fmt(locales
[locIndex
], styles
[styleIndex
], status
);
611 if (!assertSuccess("Error creating Measure format", status
)) {
614 verifyFormat("TestGreek", fmt
, &measure
, 1, expected
[counter
]);
622 void MeasureFormatTest::TestFormatSingleArg() {
623 UErrorCode status
= U_ZERO_ERROR
;
624 MeasureFormat
fmt("en", UMEASFMT_WIDTH_WIDE
, status
);
625 if (!assertSuccess("Error creating formatter", status
)) {
628 UnicodeString buffer
;
629 FieldPosition
pos(0);
631 new Measure(3.5, MeasureUnit::createFoot(status
), status
),
635 if (!assertSuccess("Error formatting", status
)) {
639 "TestFormatSingleArg",
640 UnicodeString("3.5 feet"),
644 void MeasureFormatTest::TestFormatMeasuresZeroArg() {
645 UErrorCode status
= U_ZERO_ERROR
;
646 MeasureFormat
fmt("en", UMEASFMT_WIDTH_WIDE
, status
);
647 verifyFormat("TestFormatMeasuresZeroArg", fmt
, NULL
, 0, "");
650 void MeasureFormatTest::TestMultiples() {
653 helperTestMultiples(en
, UMEASFMT_WIDTH_WIDE
, "2 miles, 1 foot, 2.3 inches");
654 helperTestMultiples(en
, UMEASFMT_WIDTH_SHORT
, "2 mi, 1 ft, 2.3 in");
655 helperTestMultiples(en
, UMEASFMT_WIDTH_NARROW
, "2mi 1\\u2032 2.3\\u2033");
656 helperTestMultiples(ru
, UMEASFMT_WIDTH_WIDE
, "2 \\u043C\\u0438\\u043B\\u0438, 1 \\u0444\\u0443\\u0442 \\u0438 2,3 \\u0434\\u044E\\u0439\\u043C\\u0430");
657 helperTestMultiples(ru
, UMEASFMT_WIDTH_SHORT
, "2 \\u043C\\u0438\\u043B\\u0438, 1 \\u0444\\u0443\\u0442, 2,3 \\u0434\\u044E\\u0439\\u043C\\u0430");
658 helperTestMultiples(ru
, UMEASFMT_WIDTH_NARROW
, "2 \\u043C\\u0438\\u043B\\u044C 1 \\u0444\\u0443\\u0442 2,3 \\u0434\\u044E\\u0439\\u043C\\u0430");
661 void MeasureFormatTest::helperTestMultiples(
662 const Locale
&locale
,
663 UMeasureFormatWidth width
,
664 const char *expected
) {
665 UErrorCode status
= U_ZERO_ERROR
;
666 FieldPosition
pos(0);
667 MeasureFormat
fmt(locale
, width
, status
);
668 if (!assertSuccess("Error creating format object", status
)) {
671 Measure measures
[] = {
672 Measure(2, MeasureUnit::createMile(status
), status
),
673 Measure(1, MeasureUnit::createFoot(status
), status
),
674 Measure(2.3, MeasureUnit::createInch(status
), status
)};
675 if (!assertSuccess("Error creating measures", status
)) {
678 UnicodeString buffer
;
679 fmt
.formatMeasures(measures
, LENGTHOF(measures
), buffer
, pos
, status
);
680 if (!assertSuccess("Error formatting measures", status
)) {
683 assertEquals("TestMultiples", UnicodeString(expected
).unescape(), buffer
);
686 void MeasureFormatTest::TestGram() {
687 UErrorCode status
= U_ZERO_ERROR
;
688 MeasureFormat
fmt("en", UMEASFMT_WIDTH_SHORT
, status
);
689 if (!assertSuccess("Error creating format object", status
)) {
692 Measure
gram(1, MeasureUnit::createGram(status
), status
);
693 Measure
gforce(1, MeasureUnit::createGForce(status
), status
);
694 if (!assertSuccess("Error creating measures", status
)) {
697 verifyFormat("TestGram", fmt
, &gram
, 1, "1 g");
698 verifyFormat("TestGram", fmt
, &gforce
, 1, "1 G");
701 void MeasureFormatTest::TestCurrencies() {
702 UChar USD
[] = {'U', 'S', 'D', 0};
703 UErrorCode status
= U_ZERO_ERROR
;
704 CurrencyAmount
USD_1(1.0, USD
, status
);
705 CurrencyAmount
USD_2(2.0, USD
, status
);
706 CurrencyAmount
USD_NEG_1(-1.0, USD
, status
);
707 if (!assertSuccess("Error creating measures", status
)) {
711 MeasureFormat
fmt(en
, UMEASFMT_WIDTH_WIDE
, status
);
712 if (!assertSuccess("Error creating format object", status
)) {
715 verifyFormat("TestCurrenciesWide", fmt
, &USD_NEG_1
, 1, "-1.00 US dollars");
716 verifyFormat("TestCurrenciesWide", fmt
, &USD_1
, 1, "1.00 US dollars");
717 verifyFormat("TestCurrenciesWide", fmt
, &USD_2
, 1, "2.00 US dollars");
718 fmt
= MeasureFormat(en
, UMEASFMT_WIDTH_SHORT
, status
);
719 if (!assertSuccess("Error creating format object", status
)) {
722 verifyFormat("TestCurrenciesShort", fmt
, &USD_NEG_1
, 1, "-USD1.00");
723 verifyFormat("TestCurrenciesShort", fmt
, &USD_1
, 1, "USD1.00");
724 verifyFormat("TestCurrenciesShort", fmt
, &USD_2
, 1, "USD2.00");
725 fmt
= MeasureFormat(en
, UMEASFMT_WIDTH_NARROW
, status
);
726 if (!assertSuccess("Error creating format object", status
)) {
729 verifyFormat("TestCurrenciesNarrow", fmt
, &USD_NEG_1
, 1, "-$1.00");
730 verifyFormat("TestCurrenciesNarrow", fmt
, &USD_1
, 1, "$1.00");
731 verifyFormat("TestCurrenciesNarrow", fmt
, &USD_2
, 1, "$2.00");
732 fmt
= MeasureFormat(en
, UMEASFMT_WIDTH_NUMERIC
, status
);
733 if (!assertSuccess("Error creating format object", status
)) {
736 verifyFormat("TestCurrenciesNumeric", fmt
, &USD_NEG_1
, 1, "-$1.00");
737 verifyFormat("TestCurrenciesNumeric", fmt
, &USD_1
, 1, "$1.00");
738 verifyFormat("TestCurrenciesNumeric", fmt
, &USD_2
, 1, "$2.00");
741 void MeasureFormatTest::TestFieldPosition() {
742 UErrorCode status
= U_ZERO_ERROR
;
743 MeasureFormat
fmt("en", UMEASFMT_WIDTH_SHORT
, status
);
744 if (!assertSuccess("Error creating format object", status
)) {
747 Measure
measure(43.5, MeasureUnit::createFoot(status
), status
);
748 if (!assertSuccess("Error creating measure object 1", status
)) {
751 UnicodeString
prefix("123456: ");
758 NumberFormat::kDecimalSeparatorField
,
761 measure
= Measure(43, MeasureUnit::createFoot(status
), status
);
762 if (!assertSuccess("Error creating measure object 2", status
)) {
771 NumberFormat::kDecimalSeparatorField
,
776 void MeasureFormatTest::TestFieldPositionMultiple() {
777 UErrorCode status
= U_ZERO_ERROR
;
778 MeasureFormat
fmt("en", UMEASFMT_WIDTH_SHORT
, status
);
779 if (!assertSuccess("Error creating format object", status
)) {
783 Measure(354, MeasureUnit::createMeter(status
), status
),
784 Measure(23, MeasureUnit::createCentimeter(status
), status
)};
786 Measure(354, MeasureUnit::createMeter(status
), status
),
787 Measure(23, MeasureUnit::createCentimeter(status
), status
),
788 Measure(5.4, MeasureUnit::createMillimeter(status
), status
)};
790 Measure(3, MeasureUnit::createMeter(status
), status
),
791 Measure(23, MeasureUnit::createCentimeter(status
), status
),
792 Measure(5, MeasureUnit::createMillimeter(status
), status
)};
793 if (!assertSuccess("Error creating measure objects", status
)) {
796 UnicodeString
prefix("123456: ");
803 NumberFormat::kIntegerField
,
812 NumberFormat::kDecimalSeparatorField
,
816 "no decimal separator",
821 NumberFormat::kDecimalSeparatorField
,
826 void MeasureFormatTest::TestBadArg() {
827 UErrorCode status
= U_ZERO_ERROR
;
828 MeasureFormat
fmt("en", UMEASFMT_WIDTH_SHORT
, status
);
829 if (!assertSuccess("Error creating format object", status
)) {
832 FieldPosition
pos(0);
833 UnicodeString buffer
;
839 if (status
!= U_ILLEGAL_ARGUMENT_ERROR
) {
840 errln("Expected ILLEGAL_ARGUMENT_ERROR");
844 void MeasureFormatTest::TestEquality() {
845 UErrorCode status
= U_ZERO_ERROR
;
846 NumberFormat
* nfeq
= NumberFormat::createInstance("en", status
);
847 NumberFormat
* nfne
= NumberFormat::createInstance("fr", status
);
848 MeasureFormat
fmt("en", UMEASFMT_WIDTH_SHORT
, status
);
849 MeasureFormat
fmtEq2("en", UMEASFMT_WIDTH_SHORT
, nfeq
, status
);
850 MeasureFormat
fmtne1("en", UMEASFMT_WIDTH_WIDE
, status
);
851 MeasureFormat
fmtne2("fr", UMEASFMT_WIDTH_SHORT
, status
);
852 MeasureFormat
fmtne3("en", UMEASFMT_WIDTH_SHORT
, nfne
, status
);
853 if (U_FAILURE(status
)) {
854 dataerrln("Error creating MeasureFormats - %s", u_errorName(status
));
857 MeasureFormat
fmtEq(fmt
);
858 assertTrue("Equal", fmt
== fmtEq
);
859 assertTrue("Equal2", fmt
== fmtEq2
);
860 assertFalse("Equal Neg", fmt
!= fmtEq
);
861 assertTrue("Not Equal 1", fmt
!= fmtne1
);
862 assertFalse("Not Equal Neg 1", fmt
== fmtne1
);
863 assertTrue("Not Equal 2", fmt
!= fmtne2
);
864 assertTrue("Not Equal 3", fmt
!= fmtne3
);
867 void MeasureFormatTest::TestDoubleZero() {
868 UErrorCode status
= U_ZERO_ERROR
;
869 Measure measures
[] = {
870 Measure(4.7, MeasureUnit::createHour(status
), status
),
871 Measure(23, MeasureUnit::createMinute(status
), status
),
872 Measure(16, MeasureUnit::createSecond(status
), status
)};
874 NumberFormat
*nf
= NumberFormat::createInstance(en
, status
);
875 MeasureFormat
fmt("en", UMEASFMT_WIDTH_WIDE
, nf
, status
);
876 UnicodeString appendTo
;
877 FieldPosition
pos(FieldPosition::DONT_CARE
);
878 if (U_FAILURE(status
)) {
879 dataerrln("Error creating formatter - %s", u_errorName(status
));
882 nf
->setMinimumFractionDigits(2);
883 nf
->setMaximumFractionDigits(2);
884 fmt
.formatMeasures(measures
, LENGTHOF(measures
), appendTo
, pos
, status
);
885 if (!assertSuccess("Error formatting", status
)) {
890 UnicodeString("4 hours, 23 minutes, 16.00 seconds"),
892 measures
[0] = Measure(-4.7, MeasureUnit::createHour(status
), status
);
894 fmt
.formatMeasures(measures
, LENGTHOF(measures
), appendTo
, pos
, status
);
895 if (!assertSuccess("Error formatting", status
)) {
900 UnicodeString("-4 hours, 23 minutes, 16.00 seconds"),
904 void MeasureFormatTest::verifyFieldPosition(
905 const char *description
,
906 const MeasureFormat
&fmt
,
907 const UnicodeString
&prefix
,
908 const Measure
*measures
,
909 int32_t measureCount
,
910 NumberFormat::EAlignmentFields field
,
914 UnicodeString
result(prefix
);
915 FieldPosition
pos(field
);
916 UErrorCode status
= U_ZERO_ERROR
;
918 const char *descPrefix
= ch
.append(description
, status
)
919 .append(": ", status
).data();
920 CharString beginIndex
;
921 beginIndex
.append(descPrefix
, status
).append("beginIndex", status
);
923 endIndex
.append(descPrefix
, status
).append("endIndex", status
);
924 fmt
.formatMeasures(measures
, measureCount
, result
, pos
, status
);
925 if (!assertSuccess("Error formatting", status
)) {
928 assertEquals(beginIndex
.data(), start
, pos
.getBeginIndex());
929 assertEquals(endIndex
.data(), end
, pos
.getEndIndex());
932 void MeasureFormatTest::verifyFormat(
933 const char *description
,
934 const MeasureFormat
&fmt
,
935 const Measure
*measures
,
936 int32_t measureCount
,
937 const char *expected
) {
938 verifyFormatWithPrefix(
947 void MeasureFormatTest::verifyFormatWithPrefix(
948 const char *description
,
949 const MeasureFormat
&fmt
,
950 const UnicodeString
&prefix
,
951 const Measure
*measures
,
952 int32_t measureCount
,
953 const char *expected
) {
954 UnicodeString
result(prefix
);
955 FieldPosition
pos(0);
956 UErrorCode status
= U_ZERO_ERROR
;
957 fmt
.formatMeasures(measures
, measureCount
, result
, pos
, status
);
958 if (!assertSuccess("Error formatting", status
)) {
961 assertEquals(description
, UnicodeString(expected
).unescape(), result
);
964 void MeasureFormatTest::verifyFormat(
965 const char *description
,
966 const MeasureFormat
&fmt
,
967 const ExpectedResult
*expectedResults
,
969 for (int32_t i
= 0; i
< count
; ++i
) {
970 verifyFormat(description
, fmt
, expectedResults
[i
].measures
, expectedResults
[i
].count
, expectedResults
[i
].expected
);
974 extern IntlTest
*createMeasureFormatTest() {
975 return new MeasureFormatTest();