@@ -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
6159pub 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