CONSTANT_FT2M, // ft2m stands for foot to meter.
CONSTANT_PI,
CONSTANT_GRAVITY,
- CONSTANT_G,
+ CONSTANT_G,
CONSTANT_CUP2M3, // CUP2M3 stands for cup to cubic meter.
CONSTANT_LB2KG,
};
// The data in this namespace are temporary, it is just for testing
-namespace temporarily {
+namespace temporarily {
struct entry {
StringPiece source;
bool reciprocal;
} dataEntries[] = {
// Base Units
- {"kilogram", "kilogram", "", "", false},
- {"candela", "candela", "", "", false},
- {"meter", "meter", "", "", false},
- {"second", "second", "", "", false},
- {"year", "year", "", "", false},
- {"ampere", "ampere", "", "", false},
- {"kelvin", "kelvin", "", "", false},
- {"revolution", "revolution", "", "", false},
- {"item", "item", "", "", false},
- {"portion", "portion", "", "", false},
- {"bit", "bit", "", "", false},
- {"pixel", "pixel", "", "", false},
- {"em", "em", "", "", false},
+ {"kilogram", "kilogram", "1", "0", false},
+ {"candela", "candela", "1", "0", false},
+ {"meter", "meter", "1", "0", false},
+ {"second", "second", "1", "0", false},
+ {"year", "year", "1", "0", false},
+ {"ampere", "ampere", "1", "0", false},
+ {"kelvin", "kelvin", "1", "0", false},
+ {"revolution", "revolution", "1", "0", false},
+ {"item", "item", "1", "0", false},
+ {"portion", "portion", "1", "0", false},
+ {"bit", "bit", "1", "0", false},
+ {"pixel", "pixel", "1", "0", false},
+ {"em", "em", "1", "0", false},
// Unit conversions Rates
- {"atmosphere", "kilogram-per-meter-square-second", "101325", "", false},
- {"byte", "bit", "8", "", false},
- {"day", "second", "86400", "", false},
- {"day-person", "second", "86400", "", false},
- {"hour", "second", "3600", "", false},
- {"minute", "second", "60", "", false},
- {"week", "second", "604800", "", false},
- {"week-person", "second", "604800", "", false},
- {"ohm", "kilogram-square-meter-per-cubic-second-square-ampere", "1", "", false},
- {"volt", "kilogram-square-meter-per-cubic-second-ampere", "1", "", false},
- {"light-year", "meter", "9460730000000000", "", false},
- {"parsec", "meter", "30856780000000000", "", false},
- {"g-force", "meter-per-square-second", "gravity", "", false},
- {"degree", "revolution", "1/360", "", false},
- {"arc-minute", "revolution", "1/360*60", "", false},
- {"arc-second", "revolution", "1/360*60*60", "", false},
- {"radian", "revolution", "1/2*PI", "", false},
- {"mole", "item", "602214076000000000000000", "", false},
- {"percent", "portion", "1/100", "", false},
- {"permille", "portion", "1/1000", "", false},
- {"permyriad", "portion", "1/10000", "", false},
- {"calorie", "kilogram-square-meter-per-square-second", "4.184", "", false},
- {"electronvolt", "kilogram-square-meter-per-square-second", "0.0000000000000000001602177", "",
+ {"atmosphere", "kilogram-per-meter-square-second", "101325", "0", false},
+ {"byte", "bit", "8", "0", false},
+ {"day", "second", "86400", "0", false},
+ {"day-person", "second", "86400", "0", false},
+ {"hour", "second", "3600", "0", false},
+ {"minute", "second", "60", "0", false},
+ {"week", "second", "604800", "0", false},
+ {"week-person", "second", "604800", "0", false},
+ {"ohm", "kilogram-square-meter-per-cubic-second-square-ampere", "1", "0", false},
+ {"volt", "kilogram-square-meter-per-cubic-second-ampere", "1", "0", false},
+ {"light-year", "meter", "9460730000000000", "0", false},
+ {"parsec", "meter", "30856780000000000", "0", false},
+ {"g-force", "meter-per-square-second", "gravity", "0", false},
+ {"degree", "revolution", "1/360", "0", false},
+ {"arc-minute", "revolution", "1/360*60", "0", false},
+ {"arc-second", "revolution", "1/360*60*60", "0", false},
+ {"radian", "revolution", "1/2*PI", "0", false},
+ {"mole", "item", "602214076000000000000000", "0", false},
+ {"percent", "portion", "1/100", "0", false},
+ {"permille", "portion", "1/1000", "0", false},
+ {"permyriad", "portion", "1/10000", "0", false},
+ {"calorie", "kilogram-square-meter-per-square-second", "4.184", "0", false},
+ {"electronvolt", "kilogram-square-meter-per-square-second", "0.0000000000000000001602177", "0",
false},
- {"foodcalorie", "kilogram-square-meter-per-square-second", "4184", "", false},
- {"hertz", "revolution-per-second", "1", "", false},
- {"astronomical-unit", "meter", "149597900000", "", false},
- {"acre", "square-meter", "ft2m^2*43560", "", false},
- {"therm-us", "kilogram-square-meter-per-square-second", "105506000", "", false},
- {"pound-force", "kilogram-meter-per-square-second", "lb2kg*gravity", "", false},
- {"fathom", "meter", "ft2m*6", "", false},
- {"foot", "meter", "ft2m", "", false},
- {"furlong", "meter", "ft2m*660", "", false},
- {"inch", "meter", "ft2m/12", "", false},
- {"mile", "meter", "ft2m*5280", "", false},
- {"nautical-mile", "meter", "1852", "", false},
- {"yard", "meter", "ft2m*3", "", false},
- {"100-kilometer", "meter", "100000", "", false},
- {"ounce", "kilogram", "lb2kg/16", "", false},
- {"ounce-troy", "kilogram", "0.03110348", "", false},
- {"pound", "kilogram", "lb2kg", "", false},
- {"stone", "kilogram", "lb2kg*14", "", false},
- {"ton", "kilogram", "lb2kg*2000", "", false},
- {"horsepower", "kilogram-square-meter-per-cubic-second", "ft2m*lb2kg*gravity*550", "", false},
- {"inch-hg", "kilogram-per-meter-square-second", "3386.389", "", false},
- {"knot", "meter-per-second", "1852/3600", "", false},
+ {"foodcalorie", "kilogram-square-meter-per-square-second", "4184", "0", false},
+ {"hertz", "revolution-per-second", "1", "0", false},
+ {"astronomical-unit", "meter", "149597900000", "0", false},
+ {"acre", "square-meter", "ft2m^2*43560", "0", false},
+ {"therm-us", "kilogram-square-meter-per-square-second", "105506000", "0", false},
+ {"pound-force", "kilogram-meter-per-square-second", "lb2kg*gravity", "0", false},
+ {"fathom", "meter", "ft2m*6", "0", false},
+ {"foot", "meter", "ft2m", "0", false},
+ {"furlong", "meter", "ft2m*660", "0", false},
+ {"inch", "meter", "ft2m/12", "0", false},
+ {"mile", "meter", "ft2m*5280", "0", false},
+ {"nautical-mile", "meter", "1852", "0", false},
+ {"yard", "meter", "ft2m*3", "0", false},
+ {"100-kilometer", "meter", "100000", "0", false},
+ {"ounce", "kilogram", "lb2kg/16", "0", false},
+ {"ounce-troy", "kilogram", "0.03110348", "0", false},
+ {"pound", "kilogram", "lb2kg", "0", false},
+ {"stone", "kilogram", "lb2kg*14", "0", false},
+ {"ton", "kilogram", "lb2kg*2000", "0", false},
+ {"horsepower", "kilogram-square-meter-per-cubic-second", "ft2m*lb2kg*gravity*550", "0", false},
+ {"inch-hg", "kilogram-per-meter-square-second", "3386.389", "0", false},
+ {"knot", "meter-per-second", "1852/3600", "0", false},
{"fahrenheit", "kelvin", "5/9", "2298.35/9", false},
- {"barrel", "cubic-meter", "cup2m3*672", "", false},
- {"bushel", "cubic-meter", "0.03523907", "", false},
- {"cup", "cubic-meter", "cup2m3", "", false},
- {"fluid-ounce", "cubic-meter", "cup2m3/8", "", false},
- {"gallon", "cubic-meter", "cup2m3*16", "", false},
- {"tablespoon", "cubic-meter", "cup2m3/16", "", false},
- {"teaspoon", "cubic-meter", "cup2m3/48", "", false},
- {"karat", "portion", "1/24", "", false},
- {"pint", "cubic-meter", "cup2m3*2", "", false},
- {"quart", "cubic-meter", "cup2m3*4", "", false},
- {"fluid-ounce-imperial", "cubic-meter", "0.00002841306", "", false},
- {"gallon-imperial", "cubic-meter", "0.00454609", "", false},
- {"dunam", "square-meter", "1000", "", false},
- {"mile-scandinavian", "meter", "10000", "", false},
- {"hectare", "square-meter", "10000", "", false},
- {"joule", "kilogram-square-meter-per-square-second", "1", "", false},
- {"newton", "kilogram-meter-per-square-second", "1", "", false},
- {"carat", "kilogram", "0.0002", "", false},
- {"gram", "kilogram", "0.001", "", false},
- {"metric-ton", "kilogram", "1000", "", false},
- {"watt", "kilogram-square-meter-per-cubic-second", "1", "", false},
- {"bar", "kilogram-per-meter-square-second", "100000", "", false},
- {"pascal", "kilogram-per-meter-square-second", "1", "", false},
+ {"barrel", "cubic-meter", "cup2m3*672", "0", false},
+ {"bushel", "cubic-meter", "0.03523907", "0", false},
+ {"cup", "cubic-meter", "cup2m3", "0", false},
+ {"fluid-ounce", "cubic-meter", "cup2m3/8", "0", false},
+ {"gallon", "cubic-meter", "cup2m3*16", "0", false},
+ {"tablespoon", "cubic-meter", "cup2m3/16", "0", false},
+ {"teaspoon", "cubic-meter", "cup2m3/48", "0", false},
+ {"karat", "portion", "1/24", "0", false},
+ {"pint", "cubic-meter", "cup2m3*2", "0", false},
+ {"quart", "cubic-meter", "cup2m3*4", "0", false},
+ {"fluid-ounce-imperial", "cubic-meter", "0.00002841306", "0", false},
+ {"gallon-imperial", "cubic-meter", "0.00454609", "0", false},
+ {"dunam", "square-meter", "1000", "0", false},
+ {"mile-scandinavian", "meter", "10000", "0", false},
+ {"hectare", "square-meter", "10000", "0", false},
+ {"joule", "kilogram-square-meter-per-square-second", "1", "0", false},
+ {"newton", "kilogram-meter-per-square-second", "1", "0", false},
+ {"carat", "kilogram", "0.0002", "0", false},
+ {"gram", "kilogram", "0.001", "0", false},
+ {"metric-ton", "kilogram", "1000", "0", false},
+ {"watt", "kilogram-square-meter-per-cubic-second", "1", "0", false},
+ {"bar", "kilogram-per-meter-square-second", "100000", "0", false},
+ {"pascal", "kilogram-per-meter-square-second", "1", "0", false},
{"celsius", "kelvin", "1", "-273.15", false},
- {"cup-metric", "cubic-meter", "0.00025", "", false},
- {"liter", "cubic-meter", "0.001", "", false},
- {"pint-metric", "cubic-meter", "0.0005", "", false},
- {"centimeter", "meter", "1/100", "", false},
- {"century", "year", "100", "", false},
- {"decade", "year", "10", "", false},
- {"dot", "pixel", "100", "", false},
- {"month", "year", "12", "", false},
- {"month-person", "year", "12", "", false},
- {"solar-luminosity", "kilogram-square-meter-per-cubic-second", "382800000000000000000000000", "",
+ {"cup-metric", "cubic-meter", "0.00025", "0", false},
+ {"liter", "cubic-meter", "0.001", "0", false},
+ {"pint-metric", "cubic-meter", "0.0005", "0", false},
+ {"centimeter", "meter", "1/100", "0", false},
+ {"century", "year", "100", "0", false},
+ {"decade", "year", "10", "0", false},
+ {"dot", "pixel", "100", "0", false},
+ {"month", "year", "12", "0", false},
+ {"month-person", "year", "12", "0", false},
+ {"solar-luminosity", "kilogram-square-meter-per-cubic-second", "382800000000000000000000000", "0",
false},
- {"solar-radius", "meter", "132712440000000000000/G", "", false},
- {"earth-radius", "meter", "6378100", "", false},
- {"solar-mass", "kilogram", "19884700000000000000000000000000", "", false},
- {"earth-mass", "kilogram", "5972200000000000000000000", "", false},
- {"year-person", "year", "1", "", false},
- {"part-per-million", "portion", "1/1000000", "", false},
- {"millimeter-of-mercury", "kilogram-per-meter-square-second", "10132500/760000", "", false},
- {"british-thermal-unit", "kilogram-square-meter-per-square-second", "1055.06", "", false},
- {"point", "meter", "ft2m/864", "", false},
- {"dalton", "kilogram-square-meter-per-square-second", "0.000000000149241808560", "", false},
- {"lux", "candela-square-meter-per-square-meter", "1", "", false},
+ {"solar-radius", "meter", "132712440000000000000/G", "0", false},
+ {"earth-radius", "meter", "6378100", "0", false},
+ {"solar-mass", "kilogram", "19884700000000000000000000000000", "0", false},
+ {"earth-mass", "kilogram", "5972200000000000000000000", "0", false},
+ {"year-person", "year", "1", "0", false},
+ {"part-per-million", "portion", "1/1000000", "0", false},
+ {"millimeter-of-mercury", "kilogram-per-meter-square-second", "10132500/760000", "0", false},
+ {"british-thermal-unit", "kilogram-square-meter-per-square-second", "1055.06", "0", false},
+ {"point", "meter", "ft2m/864", "0", false},
+ {"dalton", "kilogram-square-meter-per-square-second", "0.000000000149241808560", "0", false},
+ {"lux", "candela-square-meter-per-square-meter", "1", "0", false},
};
} // namespace temporarily
-
-
/**
* Converts from a source `MeasureUnit` to a target `MeasureUnit`.
*/
#include "../../i18n/unitconverter.h"
#include "intltest.h"
+#include "number_decnum.h"
+
+struct UnitConversionTestCase {
+ const StringPiece source;
+ const StringPiece target;
+ const double inputValue;
+ const double expectedValue;
+};
class UnitsTest : public IntlTest {
public:
void testArea();
// TODO(younies): fix this.
- void assertConversion(StringPiece message, StringPiece source, StringPiece target, double inputValue,
- double expectedValue);
+ void verifyTestCase(const UnitConversionTestCase &testCase);
};
extern IntlTest *createUnitsTest() { return new UnitsTest(); }
TESTCASE_AUTO_END;
}
+void UnitsTest::verifyTestCase(const UnitConversionTestCase &testCase) {
+ UErrorCode status;
+
+ MeasureUnit sourceUnit = MeasureUnit::forIdentifier(testCase.source, status);
+ MeasureUnit targetUnit = MeasureUnit::forIdentifier(testCase.target, status);
+
+ UnitConverter converter(sourceUnit, targetUnit, status);
+
+ number::impl::DecNum inputValue;
+ inputValue.setTo(testCase.inputValue, status);
+
+ number::impl::DecNum expectedValue;
+ expectedValue.setTo(testCase.expectedValue, status);
+
+ number::impl::DecNum actualConversionResult;
+ converter.convert(inputValue, actualConversionResult, status);
+
+ assertEqualsNear("test Conversion", expectedValue, actualConversionResult, 0.01);
+}
+
void UnitsTest::testBasic() {
IcuTestErrorCode status(*this, "Units testBasic");
- // Test Cases
- struct TestCase {
- const StringPiece source;
- const StringPiece target;
- const double inputValue;
- const double expectedValue;
- } testCases[]{
+ UnitConversionTestCase testCases[]{
{"meter", "foot", 1.0, 3.28084}, //
{"kilometer", "foot", 1.0, 328.084} //
};
for (const auto &testCase : testCases) {
- UErrorCode status;
+ UErrorCode status = U_ZERO_ERROR;
MeasureUnit sourceUnit = MeasureUnit::forIdentifier(testCase.source, status);
MeasureUnit targetUnit = MeasureUnit::forIdentifier(testCase.target, status);
number::impl::DecNum actualConversionResult;
converter.convert(inputValue, actualConversionResult, status);
- assertNearlyEquals("test Conversion", actualConversionResult, expectedValue, 0.01);
+ assertEqualsNear("test Conversion", expectedValue, actualConversionResult, 0.01);
}
}
void UnitsTest::testSiPrefixes() {
IcuTestErrorCode status(*this, "Units testSiPrefixes");
- // Test Cases
- struct TestCase {
- const StringPiece source;
- const StringPiece target;
- const double inputValue;
- const double expectedValue;
- } testCases[]{
+
+ UnitConversionTestCase testCases[]{
{"gram", "kilogram", 1.0, 0.001}, //
{"milligram", "kilogram", 1.0, 0.000001}, //
{"microgram", "kilogram", 1.0, 0.000000001}, //
};
for (const auto &testCase : testCases) {
- UErrorCode status;
-
- MeasureUnit sourceUnit = MeasureUnit::forIdentifier(testCase.source, status);
- MeasureUnit targetUnit = MeasureUnit::forIdentifier(testCase.target, status);
-
- UnitConverter converter(sourceUnit, targetUnit, status);
-
- number::impl::DecNum inputValue;
- inputValue.setTo(testCase.inputValue, status);
-
- number::impl::DecNum expectedValue;
- expectedValue.setTo(testCase.expectedValue, status);
-
- number::impl::DecNum actualConversionResult;
- converter.convert(inputValue, actualConversionResult, status);
-
- assertNearlyEquals("test Conversion", actualConversionResult, expectedValue, 0.01);
+ verifyTestCase(testCase);
}
}
void UnitsTest::testMass() {
IcuTestErrorCode status(*this, "Units testMass");
- // Test Cases
- struct TestCase {
- const StringPiece source;
- const StringPiece target;
- const double inputValue;
- const double expectedValue;
- } testCases[]{
+ UnitConversionTestCase testCases[]{
{"gram", "kilogram", 1.0, 0.001}, //
{"pound", "kilogram", 1.0, 0.453592}, //
{"pound", "kilogram", 2.0, 0.907185}, //
};
for (const auto &testCase : testCases) {
- UErrorCode status;
-
- MeasureUnit sourceUnit = MeasureUnit::forIdentifier(testCase.source, status);
- MeasureUnit targetUnit = MeasureUnit::forIdentifier(testCase.target, status);
-
- UnitConverter converter(sourceUnit, targetUnit, status);
-
- number::impl::DecNum inputValue;
- inputValue.setTo(testCase.inputValue, status);
-
- number::impl::DecNum expectedValue;
- expectedValue.setTo(testCase.expectedValue, status);
-
- number::impl::DecNum actualConversionResult;
- converter.convert(inputValue, actualConversionResult, status);
-
- assertNearlyEquals("test Conversion", actualConversionResult, expectedValue, 0.01);
+ verifyTestCase(testCase);
}
}
void UnitsTest::testTemperature() {
IcuTestErrorCode status(*this, "Units testTemperature");
- // Test Cases
- struct TestCase {
- const StringPiece source;
- const StringPiece target;
- const double inputValue;
- const double expectedValue;
- } testCases[]{
+
+ UnitConversionTestCase testCases[]{
{"celsius", "fahrenheit", 0.0, 32.0}, //
{"celsius", "fahrenheit", 10.0, 50.0}, //
{"fahrenheit", "celsius", 32.0, 0.0}, //
};
for (const auto &testCase : testCases) {
- UErrorCode status;
-
- MeasureUnit sourceUnit = MeasureUnit::forIdentifier(testCase.source, status);
- MeasureUnit targetUnit = MeasureUnit::forIdentifier(testCase.target, status);
-
- UnitConverter converter(sourceUnit, targetUnit, status);
-
- number::impl::DecNum inputValue;
- inputValue.setTo(testCase.inputValue, status);
-
- number::impl::DecNum expectedValue;
- expectedValue.setTo(testCase.expectedValue, status);
-
- number::impl::DecNum actualConversionResult;
- converter.convert(inputValue, actualConversionResult, status);
-
- assertNearlyEquals("test Conversion", actualConversionResult, expectedValue, 0.01);
+ verifyTestCase(testCase);
}
}
void UnitsTest::testArea() {
IcuTestErrorCode status(*this, "Units Area");
- // Test Cases
- struct TestCase {
- const StringPiece source;
- const StringPiece target;
- const double inputValue;
- const double expectedValue;
- } testCases[]{
+ UnitConversionTestCase testCases[]{
{"square-meter", "square-yard", 10.0, 11.9599} //
,
{"hectare", "square-yard", 1.0, 11959.9} //
};
for (const auto &testCase : testCases) {
- UErrorCode status;
-
- MeasureUnit sourceUnit = MeasureUnit::forIdentifier(testCase.source, status);
- MeasureUnit targetUnit = MeasureUnit::forIdentifier(testCase.target, status);
-
- UnitConverter converter(sourceUnit, targetUnit, status);
-
- number::impl::DecNum inputValue;
- inputValue.setTo(testCase.inputValue, status);
-
- number::impl::DecNum expectedValue;
- expectedValue.setTo(testCase.expectedValue, status);
-
- number::impl::DecNum actualConversionResult;
- converter.convert(inputValue, actualConversionResult, status);
-
- assertNearlyEquals("test Conversion", actualConversionResult, expectedValue, 0.01);
+ verifyTestCase(testCase);
}
}