degrees/ops/
sub.rs

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}