1+ //! Types and constants for handling acceleration.
2+
13use super :: measurement:: * ;
2- use super :: Speed ;
3- use std:: time:: Duration ;
4+ use super :: length;
45
56/// The `Acceleration` struct can be used to deal with Accelerations in a common way.
67/// Common metric and imperial units are supported.
@@ -15,7 +16,7 @@ use std::time::Duration;
1516/// let track = Length::from_miles(0.25);
1617/// let finish = Speed::from_miles_per_hour(120.0);
1718/// let time = Duration::new(10, 0);
18- /// let accel = finish / time;
19+ /// let accel: Acceleration = finish / time;
1920/// println!("You accelerated over {} at an average of {}", track, accel);
2021/// ```
2122#[ derive( Copy , Clone , Debug ) ]
@@ -24,45 +25,41 @@ pub struct Acceleration {
2425}
2526
2627impl Acceleration {
28+ /// Create a new Acceleration from a floating point value in meters per second per second
2729 pub fn from_meters_per_second_per_second ( meters_per_second_per_second : f64 ) -> Acceleration {
2830 Acceleration { meters_per_second_per_second : meters_per_second_per_second }
2931 }
3032
33+ /// Create a new Acceleration from a floating point value in metres per second per second
3134 pub fn from_metres_per_second_per_second ( metres_per_second_per_second : f64 ) -> Acceleration {
3235 Acceleration :: from_meters_per_second_per_second ( metres_per_second_per_second)
3336 }
3437
38+ /// Create a new Acceleration from a floating point value in feet per second per second
39+ pub fn from_feet_per_second_per_second ( feet_per_second_per_second : f64 ) -> Acceleration {
40+ Acceleration :: from_metres_per_second_per_second (
41+ feet_per_second_per_second / length:: METER_FEET_FACTOR ,
42+ )
43+ }
44+
45+ /// Convert this Acceleration to a value in meters per second per second
3546 pub fn as_meters_per_second_per_second ( & self ) -> f64 {
3647 self . meters_per_second_per_second
3748 }
3849
50+ /// Convert this Acceleration to a value in metres per second per second
3951 pub fn as_metres_per_second_per_second ( & self ) -> f64 {
4052 self . as_meters_per_second_per_second ( )
4153 }
42- }
4354
44- /// Acceleration * Time = Speed
45- impl :: std:: ops:: Mul < Duration > for Acceleration {
46- type Output = Speed ;
47-
48- fn mul ( self , rhs : Duration ) -> Speed {
49- // It would be useful if Duration had a method that did this...
50- let seconds: f64 = rhs. as_secs ( ) as f64 + ( ( rhs. subsec_nanos ( ) as f64 ) * 1e-9 ) ;
51- Speed :: from_meters_per_second ( self . as_meters_per_second_per_second ( ) * seconds)
52- }
53- }
54-
55- /// Time * Acceleration = Speed
56- impl :: std:: ops:: Mul < Acceleration > for Duration {
57- type Output = Speed ;
58-
59- fn mul ( self , rhs : Acceleration ) -> Speed {
60- rhs * self
55+ /// Convert this Acceleration to a value in feet per second per second
56+ pub fn as_feet_per_second_per_second ( & self ) -> f64 {
57+ self . meters_per_second_per_second * length:: METER_FEET_FACTOR
6158 }
6259}
6360
6461impl Measurement for Acceleration {
65- fn get_base_units ( & self ) -> f64 {
62+ fn as_base_units ( & self ) -> f64 {
6663 self . meters_per_second_per_second
6764 }
6865
@@ -76,3 +73,85 @@ impl Measurement for Acceleration {
7673}
7774
7875implement_measurement ! { Acceleration }
76+
77+ #[ cfg( test) ]
78+ mod test {
79+
80+ use super :: * ;
81+ use test_utils:: assert_almost_eq;
82+ use std:: time:: Duration ;
83+ use speed:: Speed ;
84+
85+ // Metric
86+ #[ test]
87+ fn speed_over_time ( ) {
88+ let s1 = Speed :: from_meters_per_second ( 10.0 ) ;
89+ let t1 = Duration :: new ( 5 , 0 ) ;
90+ let i1 = s1 / t1;
91+ let r1 = i1. as_meters_per_second_per_second ( ) ;
92+ assert_almost_eq ( r1, 2.0 ) ;
93+ }
94+
95+ // Traits
96+ #[ test]
97+ fn add ( ) {
98+ let a = Acceleration :: from_meters_per_second_per_second ( 2.0 ) ;
99+ let b = Acceleration :: from_meters_per_second_per_second ( 4.0 ) ;
100+ let c = a + b;
101+ let d = b + a;
102+ assert_almost_eq ( c. as_meters_per_second_per_second ( ) , 6.0 ) ;
103+ assert_eq ! ( c, d) ;
104+ }
105+
106+ #[ test]
107+ fn sub ( ) {
108+ let a = Acceleration :: from_meters_per_second_per_second ( 2.0 ) ;
109+ let b = Acceleration :: from_meters_per_second_per_second ( 4.0 ) ;
110+ let c = a - b;
111+ assert_almost_eq ( c. as_meters_per_second_per_second ( ) , -2.0 ) ;
112+ }
113+
114+ #[ test]
115+ fn mul ( ) {
116+ let a = Acceleration :: from_meters_per_second_per_second ( 3.0 ) ;
117+ let b = a * 2.0 ;
118+ let c = 2.0 * a;
119+ assert_almost_eq ( b. as_meters_per_second_per_second ( ) , 6.0 ) ;
120+ assert_eq ! ( b, c) ;
121+ }
122+
123+ #[ test]
124+ fn div ( ) {
125+ let a = Acceleration :: from_meters_per_second_per_second ( 2.0 ) ;
126+ let b = Acceleration :: from_meters_per_second_per_second ( 4.0 ) ;
127+ let c = a / b;
128+ let d = a / 2.0 ;
129+ assert_almost_eq ( c, 0.5 ) ;
130+ assert_almost_eq ( d. as_meters_per_second_per_second ( ) , 1.0 ) ;
131+ }
132+
133+ #[ test]
134+ fn eq ( ) {
135+ let a = Acceleration :: from_meters_per_second_per_second ( 2.0 ) ;
136+ let b = Acceleration :: from_meters_per_second_per_second ( 2.0 ) ;
137+ assert_eq ! ( a == b, true ) ;
138+ }
139+
140+ #[ test]
141+ fn neq ( ) {
142+ let a = Acceleration :: from_meters_per_second_per_second ( 2.0 ) ;
143+ let b = Acceleration :: from_meters_per_second_per_second ( 4.0 ) ;
144+ assert_eq ! ( a == b, false ) ;
145+ }
146+
147+ #[ test]
148+ fn cmp ( ) {
149+ let a = Acceleration :: from_meters_per_second_per_second ( 2.0 ) ;
150+ let b = Acceleration :: from_meters_per_second_per_second ( 4.0 ) ;
151+ assert_eq ! ( a < b, true ) ;
152+ assert_eq ! ( a <= b, true ) ;
153+ assert_eq ! ( a > b, false ) ;
154+ assert_eq ! ( a >= b, false ) ;
155+ }
156+
157+ }
0 commit comments