Skip to content

Commit ea60fed

Browse files
committed
fix: apply @vil02 suggestions
1 parent b523197 commit ea60fed

File tree

1 file changed

+31
-66
lines changed

1 file changed

+31
-66
lines changed

src/conversions/length_conversion.rs

Lines changed: 31 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -29,37 +29,35 @@ pub enum LengthUnit {
2929
/// It's gonna be 56 functions or 56 cases in match statement
3030
/// It's hard to write code for every unit to unit so I solve this problem
3131
/// by converting input to meter and than convert it to output
32-
impl LengthUnit {
33-
/// This function give you a number (let's call it n)
34-
/// So if you multiple a value in this unit to n you will get meters
35-
///
36-
/// m * in-unit = meter
37-
fn get_unit_to_meter_multiplier(&self) -> f64 {
38-
match self {
39-
LengthUnit::Millimeter => 0.001,
40-
LengthUnit::Centimeter => 0.01,
41-
LengthUnit::Meter => 1.0,
42-
LengthUnit::Kilometer => 1000.0,
43-
LengthUnit::Inch => 0.0254,
44-
LengthUnit::Foot => 0.3048,
45-
LengthUnit::Yard => 0.9144,
46-
LengthUnit::Mile => 1609.34,
47-
}
32+
/// This function give you a number (let's call it n)
33+
/// So if you multiple a value in this unit to n you will get meters
34+
///
35+
/// m * in-unit = meter
36+
fn unit_to_meter_multiplier(from: LengthUnit) -> f64 {
37+
match from {
38+
LengthUnit::Millimeter => 0.001,
39+
LengthUnit::Centimeter => 0.01,
40+
LengthUnit::Meter => 1.0,
41+
LengthUnit::Kilometer => 1000.0,
42+
LengthUnit::Inch => 0.0254,
43+
LengthUnit::Foot => 0.3048,
44+
LengthUnit::Yard => 0.9144,
45+
LengthUnit::Mile => 1609.34,
4846
}
47+
}
4948

50-
/// This function give you a number (let's call it n)
51-
/// So if you multiple a value in meters to n you will get unit
52-
///
53-
/// m * meter = in-unit
54-
fn get_unit_from_meter_multiplier(&self) -> f64 {
55-
1.0 / self.get_unit_to_meter_multiplier()
56-
}
49+
fn unit_to_meter(input: f64, from: LengthUnit) -> f64 {
50+
input * unit_to_meter_multiplier(from)
51+
}
52+
53+
fn meter_to_unit(input: f64, to: LengthUnit) -> f64 {
54+
input / unit_to_meter_multiplier(to)
5755
}
5856

5957
/// This function will convert a value in unit of [from] to value in unit of [to]
6058
/// by first converting it to meter and than convert it to destination unit
6159
pub fn length_conversion(input: f64, from: LengthUnit, to: LengthUnit) -> f64 {
62-
input * from.get_unit_to_meter_multiplier() * to.get_unit_from_meter_multiplier()
60+
meter_to_unit(unit_to_meter(input, from), to)
6361
}
6462

6563
#[cfg(test)]
@@ -69,44 +67,6 @@ mod length_conversion_tests {
6967
use super::LengthUnit::*;
7068
use super::*;
7169

72-
#[test]
73-
fn meter_to_other() {
74-
assert_eq!(length_conversion(4f64, Meter, Millimeter), 4000.0);
75-
assert_eq!(length_conversion(4f64, Meter, Foot), 13.123359580052492);
76-
assert_eq!(length_conversion(1.0, Meter, Kilometer), 0.001);
77-
}
78-
79-
#[test]
80-
fn other_to_meter() {
81-
assert_eq!(length_conversion(4f64, Millimeter, Meter), 0.004);
82-
assert_eq!(length_conversion(2.0, Foot, Meter), 0.6096);
83-
assert_eq!(length_conversion(1.0, Inch, Meter), 0.0254);
84-
assert_eq!(length_conversion(4.0, Yard, Meter), 3.6576);
85-
assert_eq!(length_conversion(3.0, Foot, Meter), 0.9144000000000001);
86-
}
87-
88-
#[test]
89-
fn other_to_other() {
90-
assert_eq!(length_conversion(1.0, Kilometer, Inch), 39370.07874015748);
91-
assert_eq!(length_conversion(3.0, Kilometer, Mile), 1.8641182099494205);
92-
assert_eq!(length_conversion(4.0, Foot, Yard), 1.3333333333333335);
93-
assert_eq!(length_conversion(2.0, Inch, Mile), 3.156573502181019e-5);
94-
assert_eq!(length_conversion(2.0, Centimeter, Millimeter), 20.0);
95-
assert_eq!(
96-
length_conversion(2.0, Centimeter, Yard),
97-
0.021872265966754158
98-
);
99-
assert_eq!(length_conversion(4.0, Yard, Kilometer), 0.0036576);
100-
assert_eq!(length_conversion(3.0, Foot, Inch), 36.00000000000001);
101-
assert_eq!(length_conversion(4.0, Mile, Kilometer), 6.43736);
102-
assert_eq!(length_conversion(2.0, Mile, Inch), 126719.68503937007);
103-
assert_eq!(length_conversion(3.0, Millimeter, Centimeter), 0.3);
104-
assert_eq!(
105-
length_conversion(3.0, Millimeter, Inch),
106-
0.11811023622047245
107-
);
108-
}
109-
11070
#[test]
11171
fn zero_to_zero() {
11272
let units = vec![
@@ -122,7 +82,7 @@ mod length_conversion_tests {
12282

12383
#[test]
12484
fn length_of_one_meter() {
125-
let map = HashMap::from([
85+
let meter_in_different_units = HashMap::from([
12686
(Millimeter, 1000f64),
12787
(Centimeter, 100f64),
12888
(Kilometer, 0.001f64),
@@ -131,9 +91,14 @@ mod length_conversion_tests {
13191
(Yard, 1.0936132983377078f64),
13292
(Mile, 0.0006213727366498068f64),
13393
]);
134-
135-
for (k, v) in map {
136-
assert_eq!(length_conversion(1f64, Meter, k), v);
94+
for (input_unit, input_value) in &meter_in_different_units {
95+
for (target_unit, target_value) in &meter_in_different_units {
96+
assert!(
97+
num_traits::abs(
98+
length_conversion(*input_value, *input_unit, *target_unit) - *target_value
99+
) < 0.0000001
100+
);
101+
}
137102
}
138103
}
139104
}

0 commit comments

Comments
 (0)