From 99b1513fa7e7f29292408016d8b8fe7711f5d103 Mon Sep 17 00:00:00 2001 From: Tim Alberdingk Thijm Date: Sun, 20 Dec 2020 09:46:40 -0500 Subject: [PATCH 1/3] Loosen bounds in pick_appropriate_units Change strict inequality to inequality for the inner loop of pick_appropriate_units, so that if a value is set to 1.0, then the unit returned follows a user's expectation. Closes #24. --- src/measurement.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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); } } From 284cbaf3173e7fd0daf43b9b029f1b31b3a259f5 Mon Sep 17 00:00:00 2001 From: Tim Alberdingk Thijm Date: Tue, 22 Dec 2020 10:04:02 -0500 Subject: [PATCH 2/3] Add unit tests and changelog update --- CHANGELOG.md | 4 +++ tests/pick_appropriate.rs | 62 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 66 insertions(+) create mode 100644 tests/pick_appropriate.rs 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/tests/pick_appropriate.rs b/tests/pick_appropriate.rs new file mode 100644 index 0000000..c464fad --- /dev/null +++ b/tests/pick_appropriate.rs @@ -0,0 +1,62 @@ +extern crate measurements; + +use measurements::{ + Measurement, + mass::Mass, + test_utils::assert_almost_eq, +}; + +#[test] +fn appropriate_units_eq_1() { + let val : f64 = 1e0; + let mass = Mass::from_kilograms(val); + let (s, v) = mass.get_appropriate_units(); + assert_eq!(s, "kg"); + assert_almost_eq(val, v); +} + +#[test] +fn appropriate_units_neg_1() { + let val : f64 = -1e0; + let mass = Mass::from_kilograms(val); + let (s, v) = mass.get_appropriate_units(); + assert_eq!(s, "kg"); + assert_almost_eq(val, v); +} + +#[test] +fn appropriate_units_lt_1() { + // units will now be in grams + let val : f64 = 1e0 - 1e-3; + let mass = Mass::from_kilograms(val); + let (s, v) = mass.get_appropriate_units(); + assert_eq!(s, "g"); + assert_almost_eq(val * 1e3, v); +} + +#[test] +fn appropriate_units_gt_1() { + let val : f64 = 1e0 + 1e-3; + let mass = Mass::from_kilograms(val); + let (s, v) = mass.get_appropriate_units(); + assert_eq!(s, "kg"); + assert_almost_eq(val, v); +} + +#[test] +fn appropriate_units_from_grams() { + let val : f64 = 1e3; + let mass = Mass::from_grams(val); + let (s, v) = mass.get_appropriate_units(); + assert_eq!(s, "kg"); + assert_almost_eq(val, v * 1e3); +} + +#[test] +fn appropriate_units_to_grams() { + let val : f64 = 1e-3; + let mass = Mass::from_kilograms(val); + let (s, v) = mass.get_appropriate_units(); + assert_eq!(s, "g"); + assert_almost_eq(val * 1e3, v); +} From 8a249a660a985080dfdb7716a1915ae7521f2039 Mon Sep 17 00:00:00 2001 From: Tim Alberdingk Thijm Date: Tue, 12 Jan 2021 10:27:22 -0500 Subject: [PATCH 3/3] Clean up testing of get_appropriate_units Use more descriptive test case names, and add a little macro to make writing the tests less repetitive, per @eldruin's suggestions. --- Cargo.toml | 2 +- tests/get_appropriate_units.rs | 52 ++++++++++++++++++++++++++++ tests/pick_appropriate.rs | 62 ---------------------------------- 3 files changed, 53 insertions(+), 63 deletions(-) create mode 100644 tests/get_appropriate_units.rs delete mode 100644 tests/pick_appropriate.rs 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/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 +); diff --git a/tests/pick_appropriate.rs b/tests/pick_appropriate.rs deleted file mode 100644 index c464fad..0000000 --- a/tests/pick_appropriate.rs +++ /dev/null @@ -1,62 +0,0 @@ -extern crate measurements; - -use measurements::{ - Measurement, - mass::Mass, - test_utils::assert_almost_eq, -}; - -#[test] -fn appropriate_units_eq_1() { - let val : f64 = 1e0; - let mass = Mass::from_kilograms(val); - let (s, v) = mass.get_appropriate_units(); - assert_eq!(s, "kg"); - assert_almost_eq(val, v); -} - -#[test] -fn appropriate_units_neg_1() { - let val : f64 = -1e0; - let mass = Mass::from_kilograms(val); - let (s, v) = mass.get_appropriate_units(); - assert_eq!(s, "kg"); - assert_almost_eq(val, v); -} - -#[test] -fn appropriate_units_lt_1() { - // units will now be in grams - let val : f64 = 1e0 - 1e-3; - let mass = Mass::from_kilograms(val); - let (s, v) = mass.get_appropriate_units(); - assert_eq!(s, "g"); - assert_almost_eq(val * 1e3, v); -} - -#[test] -fn appropriate_units_gt_1() { - let val : f64 = 1e0 + 1e-3; - let mass = Mass::from_kilograms(val); - let (s, v) = mass.get_appropriate_units(); - assert_eq!(s, "kg"); - assert_almost_eq(val, v); -} - -#[test] -fn appropriate_units_from_grams() { - let val : f64 = 1e3; - let mass = Mass::from_grams(val); - let (s, v) = mass.get_appropriate_units(); - assert_eq!(s, "kg"); - assert_almost_eq(val, v * 1e3); -} - -#[test] -fn appropriate_units_to_grams() { - let val : f64 = 1e-3; - let mass = Mass::from_kilograms(val); - let (s, v) = mass.get_appropriate_units(); - assert_eq!(s, "g"); - assert_almost_eq(val * 1e3, v); -}