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());
}
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.
}
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();
* 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
* 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>
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;
}
result.append(this.getSiPrefix().getIdentifier());
- result.append(this.getSimpleUnit());
+ result.append(this.getSimpleUnitID());
return result.toString();
}
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() {
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;
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,