singleUnitsInOrder.emplaceBack(singleUnits[i]);
}
- ComplexUnitsConverter(inputUnit, std::move(singleUnitsInOrder), ratesInfo, status);
+ *this = 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
return;
}
- MaybeStackVector<UnitConverter> converters;
for (int i = 0, n = outputUnits.length(); i < n; i++) {
- if (i == 0) { // first element
- converters.emplaceBack(inputUnit, *outputUnits[i], ratesInfo, status);
+ if (i == 0) { // first element
+ unitConverters_.emplaceBack(inputUnit, *outputUnits[i], ratesInfo,
+ status);
- } else {
- converters.emplaceBack(*outputUnits[i - 1], *outputUnits[i], ratesInfo, status);
- }
+ } else {
+ unitConverters_.emplaceBack(*outputUnits[i - 1], *outputUnits[i],
+ ratesInfo, status);
+ }
if (U_FAILURE(status)) break;
}
if (U_FAILURE(status)) return;
- unitConverters_.appendAll(converters, status);
units_.appendAll(outputUnits, status);
}
const auto &preference = *unitPreferences[i];
MeasureUnit complexTargetUnit = MeasureUnit::forIdentifier(preference.unit.data(), status);
- if (U_FAILURE(status)) { return; }
- converterPreferences_.emplaceBack(inputUnit, complexTargetUnit, preference.geq, conversionRates,
+ if (U_FAILURE(status)) {
+ return;
+ }
+
+ converterPreferences_.emplaceBack(inputUnit, complexTargetUnit,
+ preference.geq, conversionRates,
status);
if (U_FAILURE(status)) {
fprintf(
// http://junit.sourceforge.net/javadoc/org/junit/Assert.html#assertEquals(java.lang.String,%20double,%20double,%20double)
UBool IntlTest::assertEqualsNear(const char *message, double expected, double actual, double precision) {
double diff = std::abs(expected - actual);
- double diffPercent = expected != 0? diff / expected : diff; // If the expected is equals zero, we
+ double diffPercent =
+ expected != 0 ? diff / expected
+ : diff; // If the expected is equals zero, we assume that
+ // the `diffPercent` is equal to the difference
+ // between the actual and the expected
if (diffPercent > precision) {
errln((UnicodeString) "FAIL: " + message + "; got " + actual + "; expected " + expected);
#if !UCONFIG_NO_FORMATTING
#include <iostream>
+#include <cmath>
#include "charstr.h"
#include "cmemory.h"
_skippedFields++;
if (_skippedFields < 2) {
// We are happy skipping one field per output unit: we want to skip
- // rational fraction fiels like "11 / 10".
+ // rational fraction files like "11 / 10".
errorCode = U_ZERO_ERROR;
return;
} else {
};
void checkOutput(UnitsTest *unitsTest, const char *msg, ExpectedOutput expected,
- const MaybeStackVector<Measure> &actual) {
+ const MaybeStackVector<Measure> &actual, double precision) {
IcuTestErrorCode status(*unitsTest, "checkOutput");
bool success = true;
if (expected._compoundCount != actual.length()) {
if (i >= expected._compoundCount) {
break;
}
- if (expected._amounts[i] != actual[i]->getNumber().getDouble(status)) {
- success = false;
- break;
+
+ double diff = std::abs(expected._amounts[i] -
+ actual[i]->getNumber().getDouble(status));
+ double diffPercent =
+ expected._amounts[i] != 0 ? diff / expected._amounts[i] : diff;
+ if (diffPercent > precision) {
+ success = false;
+ break;
}
+
if (expected._measureUnits[i] != actual[i]->getUnit()) {
success = false;
break;
if (status.errIfFailureAndReset("Failure before router.route")) { return; }
MaybeStackVector<Measure> result = router.route(inputAmount, status);
if (status.errIfFailureAndReset("router.route(inputAmount, ...)")) { return; }
- checkOutput(unitsTest, msg.data(), expected, result);
+ checkOutput(unitsTest, msg.data(), expected, result, 0.0001);
}
/**