diff --git a/CHANGELOG.md b/CHANGELOG.md index 7cc4ab3..e13e620 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,10 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. Added this Changelog. +### Changed + +- Merged in [#36](https://github.com/rust-embedded-community/rust-measurements/pull/36) to adjust bounds on `Measurements::pick_appropriate_units()`, which changes the return value for cases when the value is 1.0. + ## [0.10.2] Merged in [#17](https://github.com/thejpster/rust-measurements/pull/17) to add: diff --git a/Cargo.toml b/Cargo.toml index a7ef501..3ba6e50 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -5,7 +5,7 @@ authors = ["James O'Cull ", "Jonathan Pallant ", "Hannah McLaughlin ", "Danilo Bargen ", - "Tim Alberdingk Thijm ", + "Tim Alberdingk Thijm ", ] documentation = "https://docs.rs/crate/measurements" repository = "https://github.com/thejpster/rust-measurements" diff --git a/src/measurement.rs b/src/measurement.rs index 3196146..5a03060 100644 --- a/src/measurement.rs +++ b/src/measurement.rs @@ -65,7 +65,7 @@ pub trait Measurement { fn pick_appropriate_units(&self, list: &[(&'static str, f64)]) -> (&'static str, f64) { for &(unit, ref scale) in list.iter().rev() { let value = self.as_base_units() / scale; - if value > 1.0 || value < -1.0 { + if value >= 1.0 || value <= -1.0 { return (unit, value); } } diff --git a/tests/get_appropriate_units.rs b/tests/get_appropriate_units.rs new file mode 100644 index 0000000..c5b9a9f --- /dev/null +++ b/tests/get_appropriate_units.rs @@ -0,0 +1,52 @@ +extern crate measurements; + +use measurements::{mass::Mass, test_utils::assert_almost_eq, Measurement}; + +// Macro for testing `get_appropriate_units()`. +// Specify the name of the test, the initial value (in kg) to be +// passed in and the units that should be returned when +// `get_appropriate_units()` is called. +// An additional factor term may be given for cases when a +// unit conversion takes place. +macro_rules! test_from_kg { + ($name:ident, $value:expr, $unit:expr) => { + #[test] + fn $name() { + let mass = Mass::from_kilograms($value); + let (unit, v) = mass.get_appropriate_units(); + assert_eq!(unit, $unit); + assert_almost_eq($value, v); + } + }; + ($name:ident, $value:expr, $unit:expr, $factor:expr) => { + #[test] + fn $name() { + let mass = Mass::from_kilograms($value); + let (unit, v) = mass.get_appropriate_units(); + assert_eq!(unit, $unit); + assert_almost_eq($value * $factor, v); + } + }; +} + +test_from_kg!(one_kg_keeps_unit, 1.0, "kg"); +test_from_kg!(minus_one_kg_keeps_unit, -1.0, "kg"); +test_from_kg!(more_than_one_kg_keeps_unit, 1.0 + 0.001, "kg"); +test_from_kg!( + less_than_one_kg_changes_unit_to_grams, + 1.0 - 0.001, + "g", + 1000.0 +); +test_from_kg!( + one_thousand_kg_changes_unit_to_tonnes, + 1000.0, + "tonnes", + 0.001 +); +test_from_kg!( + one_thousandth_of_kg_changes_unit_to_grams, + 0.001, + "g", + 1000.0 +);