Skip to content

Commit a291bdc

Browse files
committed
ICU-23105 Update NumberFormatterApiTest/formatUnitsAliases to fail when the units are not parsable
- Refactor test cases to use unique_ptr for MeasureUnit in C++ and adjust constructor in Java. - Introduce logging for known issues related to unit aliases to ensure compatibility with callers. - Update expected formats for unit aliases in both C++ and Java test files.
1 parent de55878 commit a291bdc

File tree

2 files changed

+45
-19
lines changed

2 files changed

+45
-19
lines changed

icu4c/source/test/intltest/numbertest_api.cpp

Lines changed: 23 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -6059,30 +6059,39 @@ void NumberFormatterApiTest::microPropsInternals() {
60596059
void NumberFormatterApiTest::formatUnitsAliases() {
60606060
IcuTestErrorCode status(*this, "formatUnitsAliases");
60616061

6062-
if (logKnownIssue("ICU-23105", "With CLDR 48m1, C++ NumberFormatterApiTest::formatUnitsAliases fails (J passes)")) {
6063-
return;
6064-
}
60656062
struct TestCase {
6066-
const MeasureUnit measureUnit;
6063+
std::unique_ptr<MeasureUnit> measureUnit;
6064+
const char * measureUnitString; // Only used if measureUnit is nullptr
60676065
const UnicodeString expectedFormat;
60686066
} testCases[]{
60696067
// Aliases
6070-
{MeasureUnit::getMilligramPerDeciliter(), u"2 milligrams per deciliter"},
6071-
{MeasureUnit::getLiterPer100Kilometers(), u"2 liters per 100 kilometers"},
6072-
{MeasureUnit::getPartPerMillion(), u"2 parts per million"},
6073-
{MeasureUnit::forIdentifier("permillion", status), u"2 parts per million"},
6074-
{MeasureUnit::getMillimeterOfMercury(), u"2 millimeters of mercury"},
6068+
{std::make_unique<MeasureUnit>(MeasureUnit::getMilligramOfglucosePerDeciliter()), nullptr, u"2 milligrams per deciliter"},
6069+
{std::make_unique<MeasureUnit>(MeasureUnit::getMilligramPerDeciliter()), nullptr, u"2 milligrams per deciliter"},
6070+
{std::make_unique<MeasureUnit>(MeasureUnit::getLiterPer100Kilometers()), nullptr,u"2 liters per 100 kilometers"},
6071+
{std::make_unique<MeasureUnit>(MeasureUnit::getPartPerMillion()), nullptr, u"2 parts per million"},
6072+
{std::make_unique<MeasureUnit>(MeasureUnit::getMillimeterOfMercury()), nullptr, u"2 millimeters of mercury"},
60756073

60766074
// Some replacements
6077-
{MeasureUnit::getMilligramOfglucosePerDeciliter(), u"2 milligrams per deciliter"},
6078-
{MeasureUnit::getLiterPer100Kilometers(), u"2 liters per 100 kilometers"},
6079-
{MeasureUnit::getPartPer1E6(), u"2 parts per million"},
6080-
{MeasureUnit::forIdentifier("millimeter-ofhg", status), u"2 millimeters of mercury"},
6075+
{nullptr, "millimeter-ofhg", u"2 millimeters of mercury"},
6076+
{nullptr, "liter-per-100-kilometer", u"2 liters per 100 kilometers"},
6077+
{nullptr, "permillion", u"2 parts per million"},
6078+
{nullptr, "part-per-million", u"2 parts per million"},
6079+
{nullptr, "part-per-1e6", u"2 parts per million"},
60816080
};
60826081

60836082
for (const auto &testCase : testCases) {
6083+
if (uprv_strcmp("permillion", testCase.measureUnitString) == 0 ||
6084+
uprv_strcmp("part-per-million", testCase.measureUnitString) == 0) {
6085+
logKnownIssue("ICU-23222", "Ensure unit aliases work correctly to avoid breaking callers");
6086+
continue;
6087+
}
6088+
6089+
MeasureUnit unit = testCase.measureUnit ? *testCase.measureUnit : MeasureUnit::forIdentifier(testCase.measureUnitString, status);
6090+
if (status.errIfFailureAndReset()) {
6091+
continue;
6092+
}
60846093
UnicodeString actualFormat = NumberFormatter::withLocale(icu::Locale::getEnglish())
6085-
.unit(testCase.measureUnit)
6094+
.unit(unit)
60866095
.unitWidth(UNumberUnitWidth::UNUM_UNIT_WIDTH_FULL_NAME)
60876096
.formatDouble(2.0, status)
60886097
.toString(status);

icu4j/main/common_tests/src/test/java/com/ibm/icu/dev/test/number/NumberFormatterApiTest.java

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5995,32 +5995,49 @@ public void formatUnitsAliases() {
59955995

59965996
class TestCase {
59975997
final MeasureUnit measureUnit;
5998+
final String measureUnitString; // Only used if measureUnit is nullptr
59985999
final String expectedFormat;
59996000

60006001
TestCase(MeasureUnit measureUnit, String expectedFormat) {
60016002
this.measureUnit = measureUnit;
6003+
this.measureUnitString = null;
6004+
this.expectedFormat = expectedFormat;
6005+
}
6006+
6007+
TestCase(String measureUnitString, String expectedFormat) {
6008+
this.measureUnit = null;
6009+
this.measureUnitString = measureUnitString;
60026010
this.expectedFormat = expectedFormat;
60036011
}
60046012
}
60056013

60066014
TestCase[] testCases = {
60076015
// Aliases
6016+
new TestCase(MeasureUnit.MILLIGRAM_OFGLUCOSE_PER_DECILITER, "2 milligrams per deciliter"),
60086017
new TestCase(MeasureUnit.MILLIGRAM_PER_DECILITER, "2 milligrams per deciliter"),
60096018
new TestCase(MeasureUnit.LITER_PER_100KILOMETERS, "2 liters per 100 kilometers"),
60106019
new TestCase(MeasureUnit.PART_PER_MILLION, "2 parts per million"),
60116020
new TestCase(MeasureUnit.MILLIMETER_OF_MERCURY, "2 millimeters of mercury"),
60126021

60136022
// Replacements
6014-
new TestCase(MeasureUnit.MILLIGRAM_OFGLUCOSE_PER_DECILITER, "2 milligrams per deciliter"),
6015-
new TestCase(MeasureUnit.forIdentifier("millimeter-ofhg"), "2 millimeters of mercury"),
6016-
new TestCase(MeasureUnit.forIdentifier("liter-per-100-kilometer"), "2 liters per 100 kilometers"),
6017-
new TestCase(MeasureUnit.forIdentifier("part-per-1e6"), "2 parts per million"),
6023+
new TestCase("millimeter-ofhg", "2 millimeters of mercury"),
6024+
new TestCase("liter-per-100-kilometer", "2 liters per 100 kilometers"),
6025+
new TestCase("permillion", "2 parts per million"),
6026+
new TestCase("part-per-million", "2 parts per million"),
6027+
new TestCase("part-per-1e6", "2 parts per million"),
60186028
};
60196029

60206030
for (TestCase testCase : testCases) {
6031+
if ("permillion".equals(testCase.measureUnitString) ||
6032+
"part-per-million".equals(testCase.measureUnitString)) {
6033+
logKnownIssue("ICU-23222", "Ensure unit aliases work correctly to avoid breaking callers");
6034+
continue;
6035+
}
6036+
6037+
MeasureUnit measureUnit = testCase.measureUnitString != null ? MeasureUnit.forIdentifier(testCase.measureUnitString) : testCase.measureUnit;
60216038
String actualFormat = NumberFormatter
60226039
.withLocale(ULocale.ENGLISH)
6023-
.unit(testCase.measureUnit)
6040+
.unit(measureUnit)
60246041
.unitWidth(UnitWidth.FULL_NAME)
60256042
.format(2.0)
60266043
.toString();

0 commit comments

Comments
 (0)