reference_interval/
reference_interval.rs

1/// Reference interval with a lower reference limit and upper reference limit.
2pub trait ReferenceInterval<T: PartialOrd> {
3    /// Lower Reference Limit (LRL)
4    fn lower(&self) -> &T;
5
6    /// Upper Reference Limit (LRL)
7    fn upper(&self) -> &T;
8
9    /// Is a value inside the reference interval?
10    fn includes(&self, value: T) -> bool {
11        value >= *self.lower() && value <= *self.upper()
12    }
13
14    /// Is a value outside the reference interval?
15    fn excludes(&self, value: T) -> bool {
16        value < *self.lower() || value > *self.upper()
17    }
18
19    /// Is a value outside the lower reference interval?
20    fn excludes_lower(&self, value: T) -> bool {
21        value < *self.lower()
22    }
23
24    /// Is a value outside the upper reference interval?
25    fn excludes_upper(&self, value: T) -> bool {
26        value > *self.upper()
27    }
28
29}
30
31#[cfg(test)]
32mod tests {
33    use super::*;
34
35    struct ReferenceIntervalStruct<T: PartialOrd> {
36        pub lower: T,
37        pub upper: T,
38    }
39
40    impl<T: PartialOrd> ReferenceInterval<T> for ReferenceIntervalStruct<T> {
41        fn lower(&self) -> &T {
42            &self.lower
43        }
44        fn upper(&self) -> &T {
45            &self.upper
46        }
47    }
48
49    #[test]
50    fn test_includes() {
51        let x = ReferenceIntervalStruct {
52            lower: 11,
53            upper: 97,
54        };
55        // Test lower boundary
56        assert_eq!(x.includes(10), false);
57        assert_eq!(x.includes(11), true);
58        assert_eq!(x.includes(12), true);
59        // Test upper boundary
60        assert_eq!(x.includes(96), true);
61        assert_eq!(x.includes(97), true);
62        assert_eq!(x.includes(98), false);
63    }
64
65    #[test]
66    fn test_excludes() {
67        let x = ReferenceIntervalStruct {
68            lower: 11,
69            upper: 97,
70        };
71        // Test lower boundary
72        assert_eq!(x.excludes(10), true);
73        assert_eq!(x.excludes(11), false);
74        assert_eq!(x.excludes(12), false);
75        // Test upper boundary
76        assert_eq!(x.excludes(96), false);
77        assert_eq!(x.excludes(97), false);
78        assert_eq!(x.excludes(98), true);
79    }
80
81    #[test]
82    fn test_excludes_lower() {
83        let x = ReferenceIntervalStruct {
84            lower: 11,
85            upper: 97,
86        };
87        // Test lower boundary
88        assert_eq!(x.excludes_lower(10), true);
89        assert_eq!(x.excludes_lower(11), false);
90        assert_eq!(x.excludes_lower(12), false);
91        // Test upper boundary
92        assert_eq!(x.excludes_lower(96), false);
93        assert_eq!(x.excludes_lower(97), false);
94        assert_eq!(x.excludes_lower(98), false);
95    }
96
97    #[test]
98    fn test_excludes_upper() {
99        let x = ReferenceIntervalStruct {
100            lower: 11,
101            upper: 97,
102        };
103        // Test lower boundary
104        assert_eq!(x.excludes_upper(10), false);
105        assert_eq!(x.excludes_upper(11), false);
106        assert_eq!(x.excludes_upper(12), false);
107        // Test upper boundary
108        assert_eq!(x.excludes_upper(96), false);
109        assert_eq!(x.excludes_upper(97), false);
110        assert_eq!(x.excludes_upper(98), true);
111    }
112
113}