]> granicus.if.org Git - icu/commitdiff
ICU-21349 ensure parser behave the same and add import test cases to Java Code
authorHugo van der Merwe <17109322+hugovdm@users.noreply.github.com>
Thu, 3 Dec 2020 11:11:06 +0000 (11:11 +0000)
committerYounies Mahmoud <younies@chromium.org>
Fri, 4 Dec 2020 00:36:22 +0000 (04:36 +0400)
See #1493

icu4c/source/test/intltest/measfmttest.cpp
icu4j/main/classes/core/src/com/ibm/icu/impl/units/ComplexUnitsConverter.java
icu4j/main/classes/core/src/com/ibm/icu/impl/units/ConversionRates.java
icu4j/main/classes/core/src/com/ibm/icu/impl/units/SingleUnitImpl.java
icu4j/main/classes/core/src/com/ibm/icu/impl/units/UnitConverter.java
icu4j/main/tests/core/src/com/ibm/icu/dev/test/format/MeasureUnitTest.java

index 3f95358fb0072fed81601a7b3889a635c32a31fd..c0180396dfbf41cfa824ff058b9dc77e4f275c29 100644 (file)
@@ -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());
 }
 
 
index dbf5b6d28a0dae52282d19431c18399bf02e0f71..cf52263cf2a5397abc315d2ed03e45800b3b7ed6 100644 (file)
@@ -204,7 +204,7 @@ public class ComplexUnitsConverter {
                 }
             }
         }
-    
+
         return result;
     }
 
index f5d1d28018679e7cdfe0f9e27d5eff5e82194811..0f69cddf4a0714f45b2c41ca22c7d84de9a15f5f 100644 (file)
@@ -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<SingleUnitImpl> 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
index 1fd92ec8858568ca36158a527ca46a82690dd8c9..0ca51c93021210f4b21d590bf4029ebd0476d05f 100644 (file)
@@ -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`.
      * <p>
@@ -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() {
index 90e29b9c52ee3539bcd499e634b2bda26a0bda69..4859bdb653fb13a3d949a26a00e4389a7f8f2ba9 100644 (file)
@@ -65,10 +65,10 @@ public class UnitConverter {
     private static void insertInMap(HashMap<String, Integer> dimensionMap, ArrayList<SingleUnitImpl> 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);
             }
         }
     }
index 3033f856f48e0687dd9b4320780dfa01a099dbc8..89c79a8d6b3965a837fa3bdd2952a9ba944710fa 100644 (file)
@@ -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,