1use crate::Temp;
2use std::ops::Sub;
3
4impl Sub for Temp {
5 type Output = Temp;
6
7 fn sub(self, rhs: Self) -> Self::Output {
8 match self {
9 Self::C(val) => {
10 let target: f32 = rhs.as_c().into();
11
12 Self::C(val - target)
13 }
14 Self::F(val) => {
15 let target: f32 = rhs.as_f().into();
16
17 Self::F(val - target)
18 }
19 Self::K(val) => {
20 let target: f32 = rhs.as_k().into();
21
22 Self::K(val - target)
23 }
24 }
25 }
26}
27
28#[cfg(test)]
29mod tests {
30 use super::*;
31
32 #[test]
33 fn should_sub_from_c() {
34 let cc = Temp::C(10.) - Temp::C(10.);
35 let cf = Temp::C(10.) - Temp::F(50.);
36 let ck = Temp::C(10.) - Temp::K(283.15);
37
38 assert_eq!(cc, Temp::C(0.));
39 assert_eq!(cf, Temp::C(0.));
40 assert_eq!(ck, Temp::C(0.));
41 }
42
43 #[test]
44 fn should_sub_from_f() {
45 let ff = Temp::F(100.) - Temp::F(100.);
46 let fc = Temp::F(100.) - Temp::C(37.778);
47 let fk = Temp::F(100.) - Temp::K(310.928);
48
49 assert_eq!(ff, Temp::F(0.));
50 assert_eq!(fc, Temp::F(0.));
51 assert_eq!(fk, Temp::F(0.));
52 }
53
54 #[test]
55 fn should_sub_from_k() {
56 let kk = Temp::K(300.) - Temp::K(300.);
57 let kc = Temp::K(300.) - Temp::C(26.85);
58 let kf = Temp::K(300.) - Temp::F(80.33);
59
60 assert_eq!(kk, Temp::K(0.));
61 assert_eq!(kf, Temp::K(0.));
62 assert_eq!(kc, Temp::K(0.));
63 }
64}