ICU-21432 Fix TestInternalMeasureUnitImpl() segfaulting with bad data

This commit is contained in:
Hugo van der Merwe 2021-02-23 15:37:32 +01:00
parent 1cd98069ab
commit aa9f5bc279

View file

@ -4580,7 +4580,9 @@ void MeasureFormatTest::TestInternalMeasureUnitImpl() {
assertEquals("mu1 initial identifier", "", mu1.identifier.data());
assertEquals("mu1 initial complexity", UMEASURE_UNIT_SINGLE, mu1.complexity);
assertEquals("mu1 initial units length", 1, mu1.singleUnits.length());
assertEquals("mu1 initial units[0]", "meter", mu1.singleUnits[0]->getSimpleUnitID());
if (mu1.singleUnits.length() > 0) {
assertEquals("mu1 initial units[0]", "meter", mu1.singleUnits[0]->getSimpleUnitID());
}
// Producing identifier via build(): the std::move() means mu1 gets modified
// while it also gets assigned to tmp's internal fImpl.
@ -4589,7 +4591,9 @@ void MeasureFormatTest::TestInternalMeasureUnitImpl() {
assertEquals("mu1 post-move-build identifier", "meter", mu1.identifier.data());
assertEquals("mu1 post-move-build complexity", UMEASURE_UNIT_SINGLE, mu1.complexity);
assertEquals("mu1 post-move-build units length", 1, mu1.singleUnits.length());
assertEquals("mu1 post-move-build units[0]", "meter", mu1.singleUnits[0]->getSimpleUnitID());
if (mu1.singleUnits.length() > 0) {
assertEquals("mu1 post-move-build units[0]", "meter", mu1.singleUnits[0]->getSimpleUnitID());
}
assertEquals("MeasureUnit tmp identifier", "meter", tmp.getIdentifier());
// This temporary variable is used when forMeasureUnit's first parameter
@ -4600,7 +4604,9 @@ void MeasureFormatTest::TestInternalMeasureUnitImpl() {
assertEquals("tmpMemory identifier", "", tmpMemory.identifier.data());
assertEquals("tmpMemory complexity", UMEASURE_UNIT_SINGLE, tmpMemory.complexity);
assertEquals("tmpMemory units length", 1, tmpMemory.singleUnits.length());
assertEquals("tmpMemory units[0]", "meter", tmpMemory.singleUnits[0]->getSimpleUnitID());
if (mu1.singleUnits.length() > 0) {
assertEquals("tmpMemory units[0]", "meter", tmpMemory.singleUnits[0]->getSimpleUnitID());
}
assertEquals("tmpImplRef identifier", "", tmpImplRef.identifier.data());
assertEquals("tmpImplRef complexity", UMEASURE_UNIT_SINGLE, tmpImplRef.complexity);
@ -4610,17 +4616,21 @@ void MeasureFormatTest::TestInternalMeasureUnitImpl() {
assertEquals("mu1 = move(mu2): identifier", "", mu1.identifier.data());
assertEquals("mu1 = move(mu2): complexity", UMEASURE_UNIT_COMPOUND, mu1.complexity);
assertEquals("mu1 = move(mu2): units length", 2, mu1.singleUnits.length());
assertEquals("mu1 = move(mu2): units[0]", "newton", mu1.singleUnits[0]->getSimpleUnitID());
assertEquals("mu1 = move(mu2): units[1]", "meter", mu1.singleUnits[1]->getSimpleUnitID());
if (mu1.singleUnits.length() >= 2) {
assertEquals("mu1 = move(mu2): units[0]", "newton", mu1.singleUnits[0]->getSimpleUnitID());
assertEquals("mu1 = move(mu2): units[1]", "meter", mu1.singleUnits[1]->getSimpleUnitID());
}
mu1 = MeasureUnitImpl::forIdentifier("hour-and-minute-and-second", status);
status.assertSuccess();
assertEquals("mu1 = HMS: identifier", "", mu1.identifier.data());
assertEquals("mu1 = HMS: complexity", UMEASURE_UNIT_MIXED, mu1.complexity);
assertEquals("mu1 = HMS: units length", 3, mu1.singleUnits.length());
assertEquals("mu1 = HMS: units[0]", "hour", mu1.singleUnits[0]->getSimpleUnitID());
assertEquals("mu1 = HMS: units[1]", "minute", mu1.singleUnits[1]->getSimpleUnitID());
assertEquals("mu1 = HMS: units[2]", "second", mu1.singleUnits[2]->getSimpleUnitID());
if (mu1.singleUnits.length() >= 3) {
assertEquals("mu1 = HMS: units[0]", "hour", mu1.singleUnits[0]->getSimpleUnitID());
assertEquals("mu1 = HMS: units[1]", "minute", mu1.singleUnits[1]->getSimpleUnitID());
assertEquals("mu1 = HMS: units[2]", "second", mu1.singleUnits[2]->getSimpleUnitID());
}
MeasureUnitImpl m2 = MeasureUnitImpl::forIdentifier("", status);
m2.appendSingleUnit(SingleUnitImpl::forMeasureUnit(MeasureUnit::getMeter(), status), status);
@ -4628,7 +4638,9 @@ void MeasureFormatTest::TestInternalMeasureUnitImpl() {
status.assertSuccess();
assertEquals("append meter twice: complexity", UMEASURE_UNIT_SINGLE, m2.complexity);
assertEquals("append meter twice: units length", 1, m2.singleUnits.length());
assertEquals("append meter twice: units[0]", "meter", m2.singleUnits[0]->getSimpleUnitID());
if (mu1.singleUnits.length() >= 1) {
assertEquals("append meter twice: units[0]", "meter", m2.singleUnits[0]->getSimpleUnitID());
}
assertEquals("append meter twice: identifier", "square-meter",
std::move(m2).build(status).getIdentifier());
@ -4638,8 +4650,12 @@ void MeasureFormatTest::TestInternalMeasureUnitImpl() {
status.assertSuccess();
assertEquals("append meter & centimeter: complexity", UMEASURE_UNIT_COMPOUND, mcm.complexity);
assertEquals("append meter & centimeter: units length", 2, mcm.singleUnits.length());
assertEquals("append meter & centimeter: units[0]", "meter", mcm.singleUnits[0]->getSimpleUnitID());
assertEquals("append meter & centimeter: units[1]", "meter", mcm.singleUnits[1]->getSimpleUnitID());
if (mu1.singleUnits.length() >= 2) {
assertEquals("append meter & centimeter: units[0]", "meter",
mcm.singleUnits[0]->getSimpleUnitID());
assertEquals("append meter & centimeter: units[1]", "meter",
mcm.singleUnits[1]->getSimpleUnitID());
}
assertEquals("append meter & centimeter: identifier", "centimeter-meter",
std::move(mcm).build(status).getIdentifier());
@ -4647,7 +4663,9 @@ void MeasureFormatTest::TestInternalMeasureUnitImpl() {
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());
if (mu1.singleUnits.length() >= 1) {
assertEquals("meter-square-meter: units[0]", "meter", m2m.singleUnits[0]->getSimpleUnitID());
}
assertEquals("meter-square-meter: identifier", "cubic-meter",
std::move(m2m).build(status).getIdentifier());
}