From c3691d22c83292d0c53480dffb9ba6c9301de975 Mon Sep 17 00:00:00 2001 From: Younies <younies.mahmoud@gmail.com> Date: Fri, 21 Feb 2020 01:42:29 +0100 Subject: [PATCH] fix small issue and add more test cases --- icu4c/source/i18n/unitconverter.cpp | 16 ++++------------ icu4c/source/test/intltest/unitstest.cpp | 14 ++++++++++++++ 2 files changed, 18 insertions(+), 12 deletions(-) diff --git a/icu4c/source/i18n/unitconverter.cpp b/icu4c/source/i18n/unitconverter.cpp index 2b971da0e72..e5e8a181c71 100644 --- a/icu4c/source/i18n/unitconverter.cpp +++ b/icu4c/source/i18n/unitconverter.cpp @@ -234,13 +234,7 @@ void extractFactor(Factor &factor, StringPiece stringFactor, UErrorCode &status) // Load factor for a single source void loadSingleFactor(Factor &factor, StringPiece source, UErrorCode &status) { factor.source = source; - bool reciprocal = false; - // TODO(younies): illustrate this step. - if (source.substr(0, 7) == "one-per") { - reciprocal = true; - source = source.substr(8); // e.g. one-per-second --> second - } for (const auto &entry : temporarily::dataEntries) { if (entry.source == factor.source) { factor.target = entry.target; @@ -248,10 +242,6 @@ void loadSingleFactor(Factor &factor, StringPiece source, UErrorCode &status) { factor.offset.setTo(entry.offset, status); factor.reciprocal = factor.reciprocal; - if (reciprocal) { - factor.flip(status); - } - return; } } @@ -269,10 +259,12 @@ void loadCompoundFactor(Factor &factor, StringPiece source, UErrorCode &status) auto singleUnit = TempSingleUnit::forMeasureUnit(singleUnits[i], status); loadSingleFactor(singleFactor, singleUnit.identifier, status); - singleFactor.power(singleUnit.dimensionality, status); + + // You must apply SiPrefix before the power, because the power may be will flip the factor. singleFactor.applySiPrefix(singleUnit.siPrefix, status); - // TODO(younies): handle `one-per-second` case + singleFactor.power(singleUnit.dimensionality, status); + factor.multiplyBy(singleFactor, status); } } diff --git a/icu4c/source/test/intltest/unitstest.cpp b/icu4c/source/test/intltest/unitstest.cpp index 997a1211e9b..21c1088a12a 100644 --- a/icu4c/source/test/intltest/unitstest.cpp +++ b/icu4c/source/test/intltest/unitstest.cpp @@ -27,6 +27,7 @@ class UnitsTest : public IntlTest { void testMass(); void testTemperature(); void testArea(); + void testComplicatedUnits(); // TODO(younies): fix this. void verifyTestCase(const UnitConversionTestCase &testCase); @@ -44,6 +45,7 @@ void UnitsTest::runIndexedTest(int32_t index, UBool exec, const char *&name, cha TESTCASE_AUTO(testMass); TESTCASE_AUTO(testTemperature); TESTCASE_AUTO(testArea); + TESTCASE_AUTO(testComplicatedUnits); TESTCASE_AUTO_END; } @@ -179,4 +181,16 @@ void UnitsTest::testArea() { } } +void UnitsTest::testComplicatedUnits() { + IcuTestErrorCode status(*this, "Units Area"); + + UnitConversionTestCase testCases[]{ + {"meter-per-second", "meter-per-millisecond", 1000.0, 1.0} // + }; + + for (const auto &testCase : testCases) { + verifyTestCase(testCase); + } +} + #endif /* #if !UCONFIG_NO_FORMATTING */ -- 2.40.0