From: Hugo van der Merwe <17109322+hugovdm@users.noreply.github.com> Date: Thu, 3 Dec 2020 11:11:06 +0000 (+0000) Subject: ICU-21349 ensure parser behave the same and add import test cases to Java Code X-Git-Tag: cldr/2021-02-17~65 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=9a28523b6e78b35d17938d5710790345823899df;p=icu ICU-21349 ensure parser behave the same and add import test cases to Java Code See #1493 --- diff --git a/icu4c/source/test/intltest/measfmttest.cpp b/icu4c/source/test/intltest/measfmttest.cpp index 3f95358fb00..c0180396dfb 100644 --- a/icu4c/source/test/intltest/measfmttest.cpp +++ b/icu4c/source/test/intltest/measfmttest.cpp @@ -4109,6 +4109,14 @@ void MeasureFormatTest::TestInternalMeasureUnitImpl() { assertEquals("append meter & centimeter: units[1]", "meter", mcm.singleUnits[1]->getSimpleUnitID()); assertEquals("append meter & centimeter: identifier", "centimeter-meter", std::move(mcm).build(status).getIdentifier()); + + MeasureUnitImpl m2m = MeasureUnitImpl::forIdentifier("meter-square-meter", status); + status.assertSuccess(); + assertEquals("meter-square-meter: complexity", UMEASURE_UNIT_SINGLE, m2m.complexity); + assertEquals("meter-square-meter: units length", 1, m2m.singleUnits.length()); + assertEquals("meter-square-meter: units[0]", "meter", m2m.singleUnits[0]->getSimpleUnitID()); + assertEquals("meter-square-meter: identifier", "cubic-meter", + std::move(m2m).build(status).getIdentifier()); } diff --git a/icu4j/main/classes/core/src/com/ibm/icu/impl/units/ComplexUnitsConverter.java b/icu4j/main/classes/core/src/com/ibm/icu/impl/units/ComplexUnitsConverter.java index dbf5b6d28a0..cf52263cf2a 100644 --- a/icu4j/main/classes/core/src/com/ibm/icu/impl/units/ComplexUnitsConverter.java +++ b/icu4j/main/classes/core/src/com/ibm/icu/impl/units/ComplexUnitsConverter.java @@ -204,7 +204,7 @@ public class ComplexUnitsConverter { } } } - + return result; } diff --git a/icu4j/main/classes/core/src/com/ibm/icu/impl/units/ConversionRates.java b/icu4j/main/classes/core/src/com/ibm/icu/impl/units/ConversionRates.java index f5d1d280186..0f69cddf4a0 100644 --- a/icu4j/main/classes/core/src/com/ibm/icu/impl/units/ConversionRates.java +++ b/icu4j/main/classes/core/src/com/ibm/icu/impl/units/ConversionRates.java @@ -40,7 +40,7 @@ public class ConversionRates { private UnitConverter.Factor getFactorToBase(SingleUnitImpl singleUnit) { int power = singleUnit.getDimensionality(); MeasureUnit.SIPrefix siPrefix = singleUnit.getSiPrefix(); - UnitConverter.Factor result = UnitConverter.Factor.processFactor(mapToConversionRate.get(singleUnit.getSimpleUnit()).getConversionRate()); + UnitConverter.Factor result = UnitConverter.Factor.processFactor(mapToConversionRate.get(singleUnit.getSimpleUnitID()).getConversionRate()); return result.applySiPrefix(siPrefix).power(power); // NOTE: you must apply the SI prefixes before the power. } @@ -60,8 +60,8 @@ public class ConversionRates { if (convertibility != UnitConverter.Convertibility.CONVERTIBLE) return BigDecimal.valueOf(0); if (!(checkSimpleUnit(source) && checkSimpleUnit(target))) return BigDecimal.valueOf(0); - String sourceSimpleIdentifier = source.getSingleUnits().get(0).getSimpleUnit(); - String targetSimpleIdentifier = target.getSingleUnits().get(0).getSimpleUnit(); + String sourceSimpleIdentifier = source.getSingleUnits().get(0).getSimpleUnitID(); + String targetSimpleIdentifier = target.getSingleUnits().get(0).getSimpleUnitID(); BigDecimal sourceOffset = this.mapToConversionRate.get(sourceSimpleIdentifier).getOffset(); BigDecimal targetOffset = this.mapToConversionRate.get(targetSimpleIdentifier).getOffset(); @@ -103,7 +103,7 @@ public class ConversionRates { * This method is helpful when checking the convertibility because no need to check convertibility. */ public ArrayList extractBaseUnits(SingleUnitImpl singleUnit) { - String target = mapToConversionRate.get(singleUnit.getSimpleUnit()).getTarget(); + String target = mapToConversionRate.get(singleUnit.getSimpleUnitID()).getTarget(); MeasureUnitImpl targetImpl = MeasureUnitImpl.UnitsParser.parseForIdentifier(target); // Each unit must be powered by the same dimension diff --git a/icu4j/main/classes/core/src/com/ibm/icu/impl/units/SingleUnitImpl.java b/icu4j/main/classes/core/src/com/ibm/icu/impl/units/SingleUnitImpl.java index 1fd92ec8858..0ca51c93021 100644 --- a/icu4j/main/classes/core/src/com/ibm/icu/impl/units/SingleUnitImpl.java +++ b/icu4j/main/classes/core/src/com/ibm/icu/impl/units/SingleUnitImpl.java @@ -20,7 +20,7 @@ public class SingleUnitImpl { * The default value is "", meaning the dimensionless unit: * isDimensionless() will return true, until index is changed. */ - private String simpleUnit = ""; + private String simpleUnitID = ""; /** * Determine the power of the `SingleUnit`. For example, for "square-meter", the dimensionality will be `2`. *

@@ -37,7 +37,7 @@ public class SingleUnitImpl { SingleUnitImpl result = new SingleUnitImpl(); result.index = this.index; result.dimensionality = this.dimensionality; - result.simpleUnit = this.simpleUnit; + result.simpleUnitID = this.simpleUnitID; result.siPrefix = this.siPrefix; return result; @@ -73,7 +73,7 @@ public class SingleUnitImpl { } result.append(this.getSiPrefix().getIdentifier()); - result.append(this.getSimpleUnit()); + result.append(this.getSimpleUnitID()); return result.toString(); } @@ -123,13 +123,13 @@ public class SingleUnitImpl { return (compareTo(other) == 0); } - public String getSimpleUnit() { - return simpleUnit; + public String getSimpleUnitID() { + return simpleUnitID; } public void setSimpleUnit(int simpleUnitIndex, String[] simpleUnits) { this.index = simpleUnitIndex; - this.simpleUnit = simpleUnits[simpleUnitIndex]; + this.simpleUnitID = simpleUnits[simpleUnitIndex]; } public int getDimensionality() { diff --git a/icu4j/main/classes/core/src/com/ibm/icu/impl/units/UnitConverter.java b/icu4j/main/classes/core/src/com/ibm/icu/impl/units/UnitConverter.java index 90e29b9c52e..4859bdb653f 100644 --- a/icu4j/main/classes/core/src/com/ibm/icu/impl/units/UnitConverter.java +++ b/icu4j/main/classes/core/src/com/ibm/icu/impl/units/UnitConverter.java @@ -65,10 +65,10 @@ public class UnitConverter { private static void insertInMap(HashMap dimensionMap, ArrayList singleUnits, int multiplier) { for (SingleUnitImpl singleUnit : singleUnits) { - if (dimensionMap.containsKey(singleUnit.getSimpleUnit())) { - dimensionMap.put(singleUnit.getSimpleUnit(), dimensionMap.get(singleUnit.getSimpleUnit()) + singleUnit.getDimensionality() * multiplier); + if (dimensionMap.containsKey(singleUnit.getSimpleUnitID())) { + dimensionMap.put(singleUnit.getSimpleUnitID(), dimensionMap.get(singleUnit.getSimpleUnitID()) + singleUnit.getDimensionality() * multiplier); } else { - dimensionMap.put(singleUnit.getSimpleUnit(), singleUnit.getDimensionality() * multiplier); + dimensionMap.put(singleUnit.getSimpleUnitID(), singleUnit.getDimensionality() * multiplier); } } } diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/format/MeasureUnitTest.java b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/format/MeasureUnitTest.java index 3033f856f48..89c79a8d6b3 100644 --- a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/format/MeasureUnitTest.java +++ b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/format/MeasureUnitTest.java @@ -40,6 +40,7 @@ import com.ibm.icu.dev.test.serializable.FormatHandler; import com.ibm.icu.dev.test.serializable.SerializableTestUtility; import com.ibm.icu.impl.Pair; import com.ibm.icu.impl.Utility; +import com.ibm.icu.impl.units.MeasureUnitImpl; import com.ibm.icu.math.BigDecimal; import com.ibm.icu.text.MeasureFormat; import com.ibm.icu.text.MeasureFormat.FormatWidth; @@ -3814,6 +3815,54 @@ public class MeasureUnitTest extends TestFmwk { MeasureUnit.MILLIGRAM.getIdentifier(), tmp.getIdentifier()); } + @Test + public void TestInternalMeasureUnitImpl() { + MeasureUnitImpl mu1 = MeasureUnitImpl.forIdentifier("meter"); + assertEquals("mu1 initial identifier", null, mu1.getIdentifier()); + assertEquals("mu1 initial complexity", MeasureUnit.Complexity.SINGLE, mu1.getComplexity()); + assertEquals("mu1 initial units length", 1, mu1.getSingleUnits().size()); + assertEquals("mu1 initial units[0]", "meter", mu1.getSingleUnits().get(0).getSimpleUnitID()); + + // Producing identifier via build(): the MeasureUnitImpl instance gets modified + // while it also gets assigned to tmp's internal measureUnitImpl. + MeasureUnit tmp = mu1.build(); + assertEquals("mu1 post-build identifier", "meter", mu1.getIdentifier()); + assertEquals("mu1 post-build complexity", MeasureUnit.Complexity.SINGLE, mu1.getComplexity()); + assertEquals("mu1 post-build units length", 1, mu1.getSingleUnits().size()); + assertEquals("mu1 post-build units[0]", "meter", mu1.getSingleUnits().get(0).getSimpleUnitID()); + assertEquals("MeasureUnit tmp identifier", "meter", tmp.getIdentifier()); + + mu1 = MeasureUnitImpl.forIdentifier("hour-and-minute-and-second"); + assertEquals("mu1 = HMS: identifier", null, mu1.getIdentifier()); + assertEquals("mu1 = HMS: complexity", MeasureUnit.Complexity.MIXED, mu1.getComplexity()); + assertEquals("mu1 = HMS: units length", 3, mu1.getSingleUnits().size()); + assertEquals("mu1 = HMS: units[0]", "hour", mu1.getSingleUnits().get(0).getSimpleUnitID()); + assertEquals("mu1 = HMS: units[1]", "minute", mu1.getSingleUnits().get(1).getSimpleUnitID()); + assertEquals("mu1 = HMS: units[2]", "second", mu1.getSingleUnits().get(2).getSimpleUnitID()); + + MeasureUnitImpl m2 = MeasureUnitImpl.forIdentifier("meter"); + m2.appendSingleUnit(MeasureUnit.METER.getCopyOfMeasureUnitImpl().getSingleUnitImpl()); + assertEquals("append meter twice: complexity", MeasureUnit.Complexity.SINGLE, m2.getComplexity()); + assertEquals("append meter twice: units length", 1, m2.getSingleUnits().size()); + assertEquals("append meter twice: units[0]", "meter", m2.getSingleUnits().get(0).getSimpleUnitID()); + assertEquals("append meter twice: identifier", "square-meter", m2.build().getIdentifier()); + + MeasureUnitImpl mcm = MeasureUnitImpl.forIdentifier("meter"); + mcm.appendSingleUnit(MeasureUnit.CENTIMETER.getCopyOfMeasureUnitImpl().getSingleUnitImpl()); + assertEquals("append meter & centimeter: complexity", MeasureUnit.Complexity.COMPOUND, mcm.getComplexity()); + assertEquals("append meter & centimeter: units length", 2, mcm.getSingleUnits().size()); + assertEquals("append meter & centimeter: units[0]", "meter", mcm.getSingleUnits().get(0).getSimpleUnitID()); + assertEquals("append meter & centimeter: units[1]", "meter", mcm.getSingleUnits().get(1).getSimpleUnitID()); + assertEquals("append meter & centimeter: identifier", "centimeter-meter", mcm.build().getIdentifier()); + + MeasureUnitImpl m2m = MeasureUnitImpl.forIdentifier("meter-square-meter"); + assertEquals("meter-square-meter: complexity", MeasureUnit.Complexity.SINGLE, m2m.getComplexity()); + assertEquals("meter-square-meter: units length", 1, m2m.getSingleUnits().size()); + assertEquals("meter-square-meter: units[0]", "meter", m2m.getSingleUnits().get(0).getSimpleUnitID()); + assertEquals("meter-square-meter: identifier", "cubic-meter", m2m.build().getIdentifier()); + + } + private void verifyCompoundUnit( MeasureUnit unit, String identifier,