lets_expect_assertions/
partial_ord.rs

1use std::{
2    fmt::Debug,
3    ops::{Add, Sub},
4};
5
6use colored::Colorize;
7use lets_expect_core::assertions::{
8    assertion_error::AssertionError, assertion_result::AssertionResult,
9};
10
11pub fn be_greater_than<R>(expected: R) -> impl Fn(&R) -> AssertionResult
12where
13    R: Debug + PartialOrd,
14{
15    move |received| {
16        if expected < *received {
17            Ok(())
18        } else {
19            let expected = format!("{:?}", expected).green().bold();
20            let received = format!("{:?}", received).red().bold();
21            Err(AssertionError {
22                message: vec![format!(
23                    "Expected {} to be greater than {}",
24                    received, expected
25                )],
26            })
27        }
28    }
29}
30
31pub fn be_greater_or_equal_to<R>(expected: R) -> impl Fn(&R) -> AssertionResult
32where
33    R: Debug + PartialOrd,
34{
35    move |received| {
36        if expected <= *received {
37            Ok(())
38        } else {
39            let expected = format!("{:?}", expected).green().bold();
40            let received = format!("{:?}", received).red().bold();
41            Err(AssertionError {
42                message: vec![format!(
43                    "Expected {} to be greater or equal to {}",
44                    received, expected
45                )],
46            })
47        }
48    }
49}
50
51pub fn be_less_than<R>(expected: R) -> impl Fn(&R) -> AssertionResult
52where
53    R: Debug + PartialOrd,
54{
55    move |received| {
56        if expected > *received {
57            Ok(())
58        } else {
59            let expected = format!("{:?}", expected).green().bold();
60            let received = format!("{:?}", received).red().bold();
61            Err(AssertionError {
62                message: vec![format!(
63                    "Expected {} to be less than {}",
64                    received, expected
65                )],
66            })
67        }
68    }
69}
70
71pub fn be_less_or_equal_to<R>(expected: R) -> impl Fn(&R) -> AssertionResult
72where
73    R: Debug + PartialOrd,
74{
75    move |received| {
76        if expected >= *received {
77            Ok(())
78        } else {
79            let expected = format!("{:?}", expected).green().bold();
80            let received = format!("{:?}", received).red().bold();
81            Err(AssertionError {
82                message: vec![format!(
83                    "Expected {} to be less or equal to {}",
84                    received, expected
85                )],
86            })
87        }
88    }
89}
90
91pub fn be_between<R>(lower: R, upper: R) -> impl Fn(&R) -> AssertionResult
92where
93    R: Debug + PartialOrd,
94{
95    move |received| {
96        if lower <= *received && *received <= upper {
97            Ok(())
98        } else {
99            let lower = format!("{:?}", lower).green().bold();
100            let upper = format!("{:?}", upper).green().bold();
101            let received = format!("{:?}", received).red().bold();
102            Err(AssertionError {
103                message: vec![format!(
104                    "Expected {} to be between {} and {}",
105                    received, lower, upper
106                )],
107            })
108        }
109    }
110}
111
112pub fn be_close_to<R>(expected: R, delta: R) -> impl Fn(&R) -> AssertionResult
113where
114    R: Debug + PartialOrd + Sub<Output = R> + Add<Output = R> + Clone,
115{
116    move |received| {
117        if expected.clone() - delta.clone() <= *received
118            && *received <= expected.clone() + delta.clone()
119        {
120            Ok(())
121        } else {
122            let expected = format!("{:?}", expected).green().bold();
123            let delta = format!("{:?}", delta).green().bold();
124            let received = format!("{:?}", received).red().bold();
125            Err(AssertionError {
126                message: vec![format!(
127                    "Expected {} to be close to {} with a delta of {}",
128                    received, expected, delta
129                )],
130            })
131        }
132    }
133}
134
135#[cfg(test)]
136mod tests {
137    use colored::control::set_override;
138
139    use crate::expected_err::expected_err;
140
141    use super::*;
142
143    #[test]
144    fn be_greater_than_ok() {
145        assert_eq!(be_greater_than(1)(&2), Ok(()));
146    }
147
148    #[test]
149    fn be_greater_than_err() {
150        set_override(false);
151        assert_eq!(
152            be_greater_than(2)(&1),
153            expected_err(vec!["Expected 1 to be greater than 2"])
154        );
155    }
156
157    #[test]
158    fn be_greater_or_equal_to_ok() {
159        assert_eq!(be_greater_or_equal_to(1)(&1), Ok(()));
160    }
161
162    #[test]
163    fn be_greater_or_equal_to_err() {
164        set_override(false);
165        assert_eq!(
166            be_greater_or_equal_to(2)(&1),
167            expected_err(vec!["Expected 1 to be greater or equal to 2"])
168        );
169    }
170
171    #[test]
172    fn be_less_than_ok() {
173        assert_eq!(be_less_than(2)(&1), Ok(()));
174    }
175
176    #[test]
177    fn be_less_than_err() {
178        set_override(false);
179        assert_eq!(
180            be_less_than(1)(&2),
181            expected_err(vec!["Expected 2 to be less than 1"])
182        );
183    }
184
185    #[test]
186    fn be_less_or_equal_to_ok() {
187        assert_eq!(be_less_or_equal_to(2)(&2), Ok(()));
188    }
189
190    #[test]
191    fn be_less_or_equal_to_err() {
192        set_override(false);
193        assert_eq!(
194            be_less_or_equal_to(1)(&2),
195            expected_err(vec!["Expected 2 to be less or equal to 1"])
196        );
197    }
198
199    #[test]
200    fn be_between_ok() {
201        assert_eq!(be_between(1, 3)(&2), Ok(()));
202    }
203
204    #[test]
205    fn be_between_err() {
206        set_override(false);
207        assert_eq!(
208            be_between(1, 3)(&4),
209            expected_err(vec!["Expected 4 to be between 1 and 3"])
210        );
211    }
212
213    #[test]
214    fn be_close_to_ok() {
215        assert_eq!(be_close_to(1f32, 0.5)(&1.5), Ok(()));
216    }
217
218    #[test]
219    fn be_close_to_err() {
220        set_override(false);
221        assert_eq!(
222            be_close_to(1f64, 0.5)(&2.5),
223            expected_err(vec!["Expected 2.5 to be close to 1.0 with a delta of 0.5"])
224        );
225    }
226}