electrical_mesurements/units/
volt.rs1use 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}