use alloc::string::String;
use core::fmt::Write;
use indoc::writedoc;
use crate::AssertThat;
use crate::mode::Mode;
use crate::tracking::AssertionTracking;
#[allow(clippy::return_self_not_must_use)]
#[cfg_attr(feature = "fluent", assertr_derive::fluent_aliases)]
pub trait CharAssertions {
fn is_equal_to_ignoring_ascii_case(self, expected: char) -> Self;
fn is_lowercase(self) -> Self;
fn is_uppercase(self) -> Self;
fn is_ascii_lowercase(self) -> Self;
fn is_ascii_uppercase(self) -> Self;
}
impl<M: Mode> CharAssertions for AssertThat<'_, char, M> {
#[track_caller]
fn is_equal_to_ignoring_ascii_case(self, expected: char) -> Self {
self.track_assertion();
let actual = self.actual();
if !actual.eq_ignore_ascii_case(&expected) {
self.add_detail_message("Actual is not equal to expected, even when ignoring casing.");
self.fail(|w: &mut String| {
writedoc! {w, r"
Expected: {expected:#?},
Actual: {actual:#?},
"}
});
}
self
}
#[track_caller]
fn is_lowercase(self) -> Self {
self.track_assertion();
let actual = self.actual();
if !actual.is_lowercase() {
self.fail(|w: &mut String| {
writedoc! {w, r"
Expected {actual:#?} to be lowercase, but it is not.
"}
});
}
self
}
#[track_caller]
fn is_uppercase(self) -> Self {
self.track_assertion();
let actual = self.actual();
if !actual.is_uppercase() {
self.fail(|w: &mut String| {
writedoc! {w, r"
Expected {actual:#?} to be uppercase, but it is not.
"}
});
}
self
}
#[track_caller]
fn is_ascii_lowercase(self) -> Self {
self.track_assertion();
let actual = self.actual();
if !actual.is_ascii_lowercase() {
self.fail(|w: &mut String| {
writedoc! {w, r"
Expected {actual:#?} to be an ascii-lowercase char, but it is not.
"}
});
}
self
}
#[track_caller]
fn is_ascii_uppercase(self) -> Self {
self.track_assertion();
let actual = self.actual();
if !actual.is_ascii_uppercase() {
self.fail(|w: &mut String| {
writedoc! {w, r"
Expected {actual:#?} to be an ascii-uppercase char, but it is not.
"}
});
}
self
}
}
#[cfg(test)]
mod tests {
mod is_equal_to_ignoring_ascii_case {
use crate::prelude::*;
use indoc::formatdoc;
#[test]
fn succeeds_when_equal_ignoring_ascii_case() {
assert_that!('a').is_equal_to_ignoring_ascii_case('A');
}
#[test]
fn panics_when_not_equal_to_ignoring_ascii_case() {
assert_that_panic_by(|| {
assert_that!('a')
.with_location(false)
.is_equal_to_ignoring_ascii_case('B')
})
.has_type::<String>()
.is_equal_to(formatdoc! {r#"
-------- assertr --------
Expected: 'B',
Actual: 'a',
Details: [
Actual is not equal to expected, even when ignoring casing.,
]
-------- assertr --------
"#});
}
}
}