1
+ //! Types and constants for handling acceleration.
2
+
1
3
use super :: measurement:: * ;
2
- use super :: Speed ;
3
- use std:: time:: Duration ;
4
+ use super :: length;
4
5
5
6
/// The `Acceleration` struct can be used to deal with Accelerations in a common way.
6
7
/// Common metric and imperial units are supported.
@@ -15,7 +16,7 @@ use std::time::Duration;
15
16
/// let track = Length::from_miles(0.25);
16
17
/// let finish = Speed::from_miles_per_hour(120.0);
17
18
/// let time = Duration::new(10, 0);
18
- /// let accel = finish / time;
19
+ /// let accel: Acceleration = finish / time;
19
20
/// println!("You accelerated over {} at an average of {}", track, accel);
20
21
/// ```
21
22
#[ derive( Copy , Clone , Debug ) ]
@@ -24,45 +25,41 @@ pub struct Acceleration {
24
25
}
25
26
26
27
impl Acceleration {
28
+ /// Create a new Acceleration from a floating point value in meters per second per second
27
29
pub fn from_meters_per_second_per_second ( meters_per_second_per_second : f64 ) -> Acceleration {
28
30
Acceleration { meters_per_second_per_second : meters_per_second_per_second }
29
31
}
30
32
33
+ /// Create a new Acceleration from a floating point value in metres per second per second
31
34
pub fn from_metres_per_second_per_second ( metres_per_second_per_second : f64 ) -> Acceleration {
32
35
Acceleration :: from_meters_per_second_per_second ( metres_per_second_per_second)
33
36
}
34
37
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
35
46
pub fn as_meters_per_second_per_second ( & self ) -> f64 {
36
47
self . meters_per_second_per_second
37
48
}
38
49
50
+ /// Convert this Acceleration to a value in metres per second per second
39
51
pub fn as_metres_per_second_per_second ( & self ) -> f64 {
40
52
self . as_meters_per_second_per_second ( )
41
53
}
42
- }
43
54
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
61
58
}
62
59
}
63
60
64
61
impl Measurement for Acceleration {
65
- fn get_base_units ( & self ) -> f64 {
62
+ fn as_base_units ( & self ) -> f64 {
66
63
self . meters_per_second_per_second
67
64
}
68
65
@@ -76,3 +73,85 @@ impl Measurement for Acceleration {
76
73
}
77
74
78
75
implement_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