assertr/assertions/core/
char.rs1use 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 }
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}