double result = inputValue;
if (conversionRate_.reciprocal) {
if (result == 0) {
- // TODO: demonstrate the resulting behaviour in tests... and figure
- // out desired behaviour. (Theoretical result should be infinity,
- // not 0.)
+ // TODO(ICU-21862): demonstrate the resulting behaviour in tests...
+ // and figure out desired behaviour. (Theoretical result should be
+ // infinity, not 0.)
return 0.0;
}
result = 1.0 / result;
struct RouteResult : UMemory {
// A list of measures: a single measure for single units, multiple measures
// for mixed units.
- //
- // TODO(icu-units/icu#21): figure out the right mixed unit API.
MaybeStackVector<Measure> measures;
// The output unit for this RouteResult. This may be a MIXED unit - for
30500,
u"350 m");
+ assertFormatSingle(u"Fuel consumption: inverted units", //
+ u"unit/liter-per-100-kilometer usage/vehicle-fuel", //
+ u"unit/liter-per-100-kilometer usage/vehicle-fuel", //
+ NumberFormatter::with() //
+ .unit(MeasureUnit::forIdentifier("liter-per-100-kilometer", status)) //
+ .usage("vehicle-fuel"), //
+ Locale("en-US"), //
+ 6.6, //
+ "36 mpg");
+
+// // TODO(ICU-21862): determine desired behaviour. Commented out for now to not enforce undesirable
+// // behaviour
+// assertFormatSingle(u"Fuel consumption: inverted units, divide-by-zero", //
+// u"unit/liter-per-100-kilometer usage/vehicle-fuel", //
+// u"unit/liter-per-100-kilometer usage/vehicle-fuel", //
+// NumberFormatter::with() //
+// .unit(MeasureUnit::forIdentifier("liter-per-100-kilometer", status)) //
+// .usage("vehicle-fuel"), //
+// Locale("en-US"), //
+// 0, //
+// "0 mpg"); // TODO(ICU-21862)
+
// Test calling `.usage("")` should unset the existing usage.
// First: without usage
assertFormatSingle(u"Rounding Mode propagates: rounding up",
Locale("en-US"), //
1, //
"0.019 psi");
-
- // TODO(icu-units#38): improve unit testing coverage. E.g. add vehicle-fuel
- // triggering inversion conversion code. Test with 0 too, to see
- // divide-by-zero behaviour.
}
void NumberFormatterApiTest::unitUsageErrorCodes() {
// Fuel Consumption
{"cubic-meter-per-meter", "mile-per-gallon", 2.1383143939394E-6, 1.1},
{"cubic-meter-per-meter", "mile-per-gallon", 2.6134953703704E-6, 0.9},
+ {"liter-per-100-kilometer", "mile-per-gallon", 6.6, 35.6386},
+ // // TODO(ICU-21862): we should probably return something other than "0":
+ // {"liter-per-100-kilometer", "mile-per-gallon", 0, 0},
// Test Aliases
// Alias is just another name to the same unit. Therefore, converting
Measure(2.1, MeasureUnit::createMeter(status), status)},
2,
0.001},
+
+ // Negative numbers
+ {"Negative number conversion",
+ "yard",
+ "mile-and-yard",
+ -1800,
+ {Measure(-1, MeasureUnit::createMile(status), status),
+ Measure(-40, MeasureUnit::createYard(status), status)},
+ 2,
+ 1e-10},
};
status.assertSuccess();
ComplexUnitsConverter converter2( testCase.input, testCase.output, status);
testATestCase(converter2, "ComplexUnitsConverter #1 " , testCase);
}
-
-
status.assertSuccess();
-
- // TODO(icu-units#63): test negative numbers!
}
void UnitsTest::testComplexUnitsConverterSorting() {
if (this.reciprocal) {
// We should see no offsets for reciprocal conversions - they don't make sense:
assert offset == BigDecimal.ZERO;
- if (result == BigDecimal.ZERO) {
- // TODO: demonstrate the resulting behaviour in tests... and
- // figure out desired behaviour. (Theoretical result should be
- // infinity, not 0, but BigDecimal does not support infinity.)
+ if (result.compareTo(BigDecimal.ZERO) == 0) {
+ // TODO(ICU-21862): determine desirable behaviour
return BigDecimal.ZERO;
}
result = BigDecimal.ONE.divide(result, DECIMAL128);
if (this.reciprocal) {
// We should see no offsets for reciprocal conversions - they don't make sense:
assert offset == BigDecimal.ZERO;
- if (result == BigDecimal.ZERO) {
- // TODO: demonstrate the resulting behaviour in tests... and
- // figure out desired behaviour. (Theoretical result should be
- // infinity, not 0, but BigDecimal does not support infinity.)
+ if (result.compareTo(BigDecimal.ZERO) == 0) {
+ // TODO(ICU-21862): determine desirable behaviour
return BigDecimal.ZERO;
}
result = BigDecimal.ONE.divide(result, DECIMAL128);
0),
// A minimal nudge under 2.0, rounding up to 2.0 ft, 0 in.
- // TODO(icu-units#108): this matches double precision calculations
+ // TODO(ICU-21861): this matches double precision calculations
// from C++, but BigDecimal is in use: do we want Java to be more
// precise than C++?
new TestCase(
// 1e-16 light years is 0.946073 meters.
// A 2.1 meter nudge under 2.0 light years, rounding up to 2.0 ly, 0 m.
- // TODO(icu-units#108): this matches double precision calculations
+ // TODO(ICU-21861): this matches double precision calculations
// from C++, but BigDecimal is in use: do we want Java to be more
// precise than C++?
new TestCase("light-year", "light-year-and-meter",
new Measure(0, MeasureUnit.METER)},
0),
- // // TODO(icu-units#108): figure out precision thresholds for BigDecimal?
+ // // TODO(ICU-21861): figure out precision thresholds for BigDecimal?
// // This test passes in C++ due to double-precision rounding.
// // A 2.1 meter nudge under 1.0 light years, rounding up to 1.0 ly, 0 m.
// new TestCase("light-year", "light-year-and-meter",
new Measure(9.46073, MeasureUnit.METER)},
0 /* meters, precision */),
- // TODO(icu-units#108): reconsider whether epsilon rounding is desirable:
+ // TODO(ICU-21861): reconsider whether epsilon rounding is desirable:
//
// 2e-16 light years is 1.892146 meters. For C++ double, we consider
// this in the noise, and thus expect a 0. (This test fails when
new Measure[] {new Measure(1, MeasureUnit.LIGHT_YEAR),
new Measure(1.892146, MeasureUnit.METER)},
0),
- };
+ // Negative numbers
+ new TestCase(
+ "yard", "mile-and-yard", BigDecimal.valueOf(-1800),
+ new Measure[] {new Measure(-1, MeasureUnit.MILE), new Measure(-40, MeasureUnit.YARD)},
+ 1e-10),
+ };
ConversionRates rates = new ConversionRates();
MeasureUnit input, output;
ComplexUnitsConverter converter2 = new ComplexUnitsConverter(testCase.input, testCase.output);
testCase.testATestCase(converter2);
}
-
- // TODO(icu-units#63): test negative numbers!
}
// Fuel Consumption
new TestData("cubic-meter-per-meter", "mile-per-gallon", 2.1383143939394E-6, 1.1),
new TestData("cubic-meter-per-meter", "mile-per-gallon", 2.6134953703704E-6, 0.9),
+ new TestData("liter-per-100-kilometer", "mile-per-gallon", 6.6, 35.6386),
+ // // TODO(ICU-21862): we should probably return something other than "0":
+ // new TestData("liter-per-100-kilometer", "mile-per-gallon", 0, 0),
// Test Aliases
// Alias is just another name to the same unit. Therefore, converting
// between them should be the same.
30500,
"350 m");
+ assertFormatSingle("Fuel consumption: inverted units",
+ "unit/liter-per-100-kilometer usage/vehicle-fuel",
+ "unit/liter-per-100-kilometer usage/vehicle-fuel",
+ NumberFormatter.with()
+ .unit(MeasureUnit.forIdentifier("liter-per-100-kilometer"))
+ .usage("vehicle-fuel"),
+ new ULocale("en-US"), //
+ 6.6, //
+ "36 mpg");
+
+ // // TODO(ICU-21862): determine desired behaviour. Commented out for now
+ // // to not enforce undesirable behaviour
+ // assertFormatSingle("Fuel consumption: inverted units, divide-by-zero",
+ // "unit/liter-per-100-kilometer usage/vehicle-fuel",
+ // "unit/liter-per-100-kilometer usage/vehicle-fuel",
+ // NumberFormatter.with()
+ // .unit(MeasureUnit.forIdentifier("liter-per-100-kilometer"))
+ // .usage("vehicle-fuel"),
+ // new ULocale("en-US"), //
+ // 0, //
+ // "0 mpg");
+
// Test calling .usage("") or .usage(null) should unset the existing usage.
// First: without usage
assertFormatSingle("Rounding Mode propagates: rounding up",
new ULocale("en-US"),
1,
"0.019 psi");
-
- // TODO(icu-units#38): improve unit testing coverage. E.g. add
- // vehicle-fuel triggering inversion conversion code. Test with 0 too,
- // to see divide-by-zero behaviour.
}
@Test