Skip to main content

assertr/assertions/core/
char.rs

1use core::fmt::Write;
2use indoc::writedoc;
3
4use crate::AssertThat;
5use crate::mode::Mode;
6use crate::tracking::AssertionTracking;
7
8#[allow(clippy::return_self_not_must_use)]
9#[cfg_attr(feature = "fluent", assertr_derive::fluent_aliases)]
10pub trait CharAssertions {
11    fn is_equal_to_ignoring_ascii_case(self, expected: char) -> Self;
12
13    fn is_lowercase(self) -> Self;
14
15    fn is_uppercase(self) -> Self;
16
17    fn is_ascii_lowercase(self) -> Self;
18
19    fn is_ascii_uppercase(self) -> Self;
20
21    //fn is_ascii(self) -> Self;
22    //fn is_whitespace(self) -> Self;
23    //fn is_alphabetic(self) -> Self;
24    //fn is_alphanumeric(self) -> Self;
25    //fn is_numeric(self) -> Self;
26}
27
28impl<M: Mode> CharAssertions for AssertThat<'_, char, M> {
29    #[track_caller]
30    fn is_equal_to_ignoring_ascii_case(self, expected: char) -> Self {
31        self.track_assertion();
32        let actual = self.actual();
33        if !actual.eq_ignore_ascii_case(&expected) {
34            self.add_detail_message("Actual is not equal to expected, even when ignoring casing.");
35            self.fail(|w: &mut String| {
36                writedoc! {w, r"
37                    Expected: {expected:#?},
38
39                      Actual: {actual:#?},
40                "}
41            });
42        }
43        self
44    }
45
46    #[track_caller]
47    fn is_lowercase(self) -> Self {
48        self.track_assertion();
49        let actual = self.actual();
50        if !actual.is_lowercase() {
51            self.fail(|w: &mut String| {
52                writedoc! {w, r"
53                    Expected {actual:#?} to be lowercase, but it is not.
54                "}
55            });
56        }
57        self
58    }
59
60    #[track_caller]
61    fn is_uppercase(self) -> Self {
62        self.track_assertion();
63        let actual = self.actual();
64        if !actual.is_uppercase() {
65            self.fail(|w: &mut String| {
66                writedoc! {w, r"
67                    Expected {actual:#?} to be uppercase, but it is not.
68                "}
69            });
70        }
71        self
72    }
73
74    #[track_caller]
75    fn is_ascii_lowercase(self) -> Self {
76        self.track_assertion();
77        let actual = self.actual();
78        if !actual.is_ascii_lowercase() {
79            self.fail(|w: &mut String| {
80                writedoc! {w, r"
81                    Expected {actual:#?} to be an ascii-lowercase char, but it is not.
82                "}
83            });
84        }
85        self
86    }
87
88    #[track_caller]
89    fn is_ascii_uppercase(self) -> Self {
90        self.track_assertion();
91        let actual = self.actual();
92        if !actual.is_ascii_uppercase() {
93            self.fail(|w: &mut String| {
94                writedoc! {w, r"
95                    Expected {actual:#?} to be an ascii-uppercase char, but it is not.
96                "}
97            });
98        }
99        self
100    }
101}
102
103#[cfg(test)]
104mod tests {
105
106    mod is_equal_to_ignoring_ascii_case {
107        use crate::prelude::*;
108        use indoc::formatdoc;
109
110        #[test]
111        fn succeeds_when_equal_ignoring_ascii_case() {
112            assert_that!('a').is_equal_to_ignoring_ascii_case('A');
113        }
114
115        #[test]
116        fn panics_when_not_equal_to_ignoring_ascii_case() {
117            assert_that_panic_by(|| {
118                assert_that!('a')
119                    .with_location(false)
120                    .is_equal_to_ignoring_ascii_case('B')
121            })
122            .has_type::<String>()
123            .is_equal_to(formatdoc! {r#"
124                -------- assertr --------
125                Expected: 'B',
126                
127                  Actual: 'a',
128                
129                Details: [
130                    Actual is not equal to expected, even when ignoring casing.,
131                ]
132                -------- assertr --------
133            "#});
134        }
135    }
136}