]> granicus.if.org Git - icu/commitdiff
Add error-handling to avoid assertion failure.
authorHugo van der Merwe <17109322+hugovdm@users.noreply.github.com>
Thu, 21 May 2020 21:19:35 +0000 (23:19 +0200)
committerHugo van der Merwe <17109322+hugovdm@users.noreply.github.com>
Thu, 21 May 2020 21:19:35 +0000 (23:19 +0200)
icu4c/source/i18n/complexunitsconverter.cpp
icu4c/source/test/intltest/unitstest.cpp

index b5eca8e1c69c1e84c97d7a756baccf19685dd02f..b2324104101cdb1ad67c89f0e9ce89d478de6445 100644 (file)
@@ -25,6 +25,13 @@ ComplexUnitsConverter::ComplexUnitsConverter(const MeasureUnit inputUnit, const
     }
 
     ComplexUnitsConverter(inputUnit, std::move(singleUnitsInOrder), ratesInfo, status);
+
+    // TODO(younies): question from Hugo: is this check appropriate? The
+    // U_ASSERT in greaterThanOrEqual suggests this should be an invariant for
+    // ComplexUnitConverter.
+    if (unitConverters_.length() == 0) {
+        status = U_INTERNAL_PROGRAM_ERROR;
+    }
 }
 
 ComplexUnitsConverter::ComplexUnitsConverter(const MeasureUnit inputUnit,
@@ -54,6 +61,7 @@ ComplexUnitsConverter::ComplexUnitsConverter(const MeasureUnit inputUnit,
 }
 
 UBool ComplexUnitsConverter::greaterThanOrEqual(double quantity, double limit) const {
+    // TODO(younies): this assert fails for the first constructor above:
     U_ASSERT(unitConverters_.length() > 0);
 
     // first quantity is the biggest one.
index ce5c0118247f1bb5a458a45fb4efa9a72f2af983..0be1ede1db3b9aec05b347beb3b1f56745573eb9 100644 (file)
@@ -583,14 +583,12 @@ void unitPreferencesTestDataLineFn(void *context, char *fields[][2], int32_t fie
                                     usage.length(), usage.data())) {
         return;
     }
-    // FIXME/TODO: actually test output. At this point, this causes an assertion
-    // failure in complexunitsconverter.cpp:
-    //
-    // MaybeStackVector<Measure> result = router.route(inputAmount, status);
-    // for (int i=0; i<result.length(); i++) {
-    //     unitsTest->logln("result[%d], number: %f, unit: %s", i, result[i]->getNumber().getDouble(status),
-    //                      result[i]->getUnit().getIdentifier());
-    // }
+
+    MaybeStackVector<Measure> result = router.route(inputAmount, status);
+    for (int i = 0; i < result.length(); i++) {
+        unitsTest->logln("result[%d], number: %f, unit: %s", i, result[i]->getNumber().getDouble(status),
+                         result[i]->getUnit().getIdentifier());
+    }
 }
 
 /**