electrical_mesurements/units/
volt.rs

1use std::fmt;
2use std::ops::{Mul, MulAssign, Div, DivAssign, Add, AddAssign, Sub, SubAssign, Rem, RemAssign};
3#[derive(PartialEq, Debug, Copy, Clone)]
4pub struct Volt {
5    pub value: f64,
6}
7
8impl Volt {
9    pub fn new(value: f64) -> Self {
10        Self { value }
11    }
12    pub fn reciprocal(&self) -> Self {
13        Self { value: 1.0 / self.value }
14    }
15}
16
17impl Mul<Volt> for Volt {
18    type Output = Volt;
19
20    fn mul(self, other: Volt) -> Volt {
21        Volt::new(self.value * other.value)
22    }
23}
24
25impl MulAssign<Volt> for Volt {
26    fn mul_assign(&mut self, other: Volt) {
27        *self = Volt::new(self.value * other.value);
28    }
29}
30
31impl Div<Volt> for Volt {
32    type Output = Volt;
33
34    fn div(self, other: Volt) -> Volt {
35        Volt::new(self.value / other.value)
36    }
37}
38
39impl DivAssign<Volt> for Volt {
40    fn div_assign(&mut self, other: Volt) {
41        *self = Volt::new(self.value / other.value);
42    }
43}
44
45impl Add<Volt> for Volt {
46    type Output = Volt;
47
48    fn add(self, other: Volt) -> Volt {
49        Volt::new(self.value + other.value)
50    }
51}
52
53impl AddAssign<Volt> for Volt {
54    fn add_assign(&mut self, other: Volt) {
55        *self = Volt::new(self.value + other.value);
56    }
57}
58
59impl Sub<Volt> for Volt {
60    type Output = Volt;
61
62    fn sub(self, other: Volt) -> Volt {
63        Volt::new(self.value - other.value)
64    }
65}
66
67impl SubAssign<Volt> for Volt {
68    fn sub_assign(&mut self, other: Volt) {
69        *self = Volt::new(self.value - other.value);
70    }
71}
72
73impl Rem<Volt> for Volt {
74    type Output = Volt;
75
76    fn rem(self, other: Volt) -> Volt {
77        Volt::new(self.value % other.value)
78    }
79}
80
81impl RemAssign<Volt> for Volt {
82    fn rem_assign(&mut self, other: Volt) {
83        *self = Volt::new(self.value % other.value);
84    }
85}
86
87impl fmt::Display for Volt {
88    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
89        write!(f, "{:.} V", self.value)
90    }
91}
92
93#[cfg(test)]
94mod tests {
95    use super::*;
96
97    #[test]
98    fn volts_eq_volts() {
99        assert_eq!(Volt::new(5.0).value, 5.0)
100    }
101
102    #[test]
103    fn volts_add() {
104        assert_eq!(Volt::new(5.0) + Volt::new(3.0), Volt::new(8.0))
105    }
106
107    #[test]
108    fn volts_add_neg() {
109        assert_eq!(Volt::new(-5.0) + Volt::new(3.0), Volt::new(-2.0))
110    }
111
112    #[test]
113    fn volts_add_assign() {
114        let mut test_value = Volt::new(5.0);
115        test_value += Volt::new(3.0);
116        assert_eq!(test_value, Volt::new(8.0))
117    }
118
119    #[test]
120    fn volts_add_assign_neg() {
121        let mut test_value = Volt::new(-5.0);
122        test_value += Volt::new(3.0);
123        assert_eq!(test_value, Volt::new(-2.0))
124    }
125
126    #[test]
127    fn volts_sub() {
128        assert_eq!(Volt::new(5.0) - Volt::new(3.0), Volt::new(2.0))
129    }
130
131    #[test]
132    fn volts_sub_neg() {
133        assert_eq!(Volt::new(-5.0) - Volt::new(3.0), Volt::new(-8.0))
134    }
135
136    #[test]
137    fn volts_sub_assign() {
138        let mut test_value = Volt::new(5.0);
139        test_value -= Volt::new(3.0);
140        assert_eq!(test_value, Volt::new(2.0))
141    }
142
143    #[test]
144    fn volts_sub_assign_neg() {
145        let mut test_value = Volt::new(-5.0);
146        test_value -= Volt::new(3.0);
147        assert_eq!(test_value, Volt::new(-8.0))
148    }
149
150    #[test]
151    fn volts_mul() {
152        assert_eq!(Volt::new(5.0) * Volt::new(3.0), Volt::new(15.0))
153    }
154
155    #[test]
156    fn volts_mul_neg() {
157        assert_eq!(Volt::new(-5.0) * Volt::new(3.0), Volt::new(-15.0))
158    }
159
160    #[test]
161    fn volts_mul_assign() {
162        let mut test_value = Volt::new(5.0);
163        test_value *= Volt::new(3.0);
164        assert_eq!(test_value, Volt::new(15.0))
165    }
166
167    #[test]
168    fn volts_mul_assign_neg() {
169        let mut test_value = Volt::new(-5.0);
170        test_value *= Volt::new(3.0);
171        assert_eq!(test_value, Volt::new(-15.0))
172    }
173
174    #[test]
175    fn volts_div() {
176        assert_eq!(Volt::new(5.0) / Volt::new(3.0), Volt::new(5.0 / 3.0))
177    }
178
179    #[test]
180    fn volts_div_neg() {
181        assert_eq!(Volt::new(-5.0) / Volt::new(3.0), Volt::new(-5.0 / 3.0))
182    }
183
184    #[test]
185    fn volts_div_assign() {
186        let mut test_value = Volt::new(5.0);
187        test_value /= Volt::new(3.0);
188        assert_eq!(test_value, Volt::new(5.0 / 3.0))
189    }
190
191    #[test]
192    fn volts_div_assign_neg() {
193        let mut test_value = Volt::new(-5.0);
194        test_value /= Volt::new(3.0);
195        assert_eq!(test_value, Volt::new(-5.0 / 3.0))
196    }
197
198    #[test]
199    fn volts_rem() {
200        assert_eq!(Volt::new(5.0) % Volt::new(3.0), Volt::new(2.0))
201    }
202
203    #[test]
204    fn volts_rem_neg() {
205        assert_eq!(Volt::new(-5.0) % Volt::new(3.0), Volt::new(-2.0))
206    }
207
208    #[test]
209    fn volts_rem_assign() {
210        let mut test_value = Volt::new(5.0);
211        test_value %= Volt::new(3.0);
212        assert_eq!(test_value, Volt::new(2.0))
213    }
214
215    #[test]
216    fn volts_rem_assign_neg() {
217        let mut test_value = Volt::new(-5.0);
218        test_value %= Volt::new(3.0);
219        assert_eq!(test_value, Volt::new(-2.0))
220    }
221
222    #[test]
223    fn volts_display() {
224        assert_eq!(format!("{}", Volt::new(5.0)), "5 V")
225    }
226
227}