mirror of
https://github.com/unicode-org/icu.git
synced 2025-04-10 07:39:16 +00:00
ICU-21432 Fix TestInternalMeasureUnitImpl() segfaulting with bad data
This commit is contained in:
parent
1cd98069ab
commit
aa9f5bc279
1 changed files with 30 additions and 12 deletions
|
@ -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());
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue