#[inline]
pub fn floor_char_boundary(s: &str, max: usize) -> usize {
if max >= s.len() {
return s.len();
}
let mut i = max;
while !s.is_char_boundary(i) {
i -= 1;
}
i
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn ascii_truncation() {
assert_eq!(floor_char_boundary("hello", 3), 3);
assert_eq!(floor_char_boundary("hello", 0), 0);
assert_eq!(floor_char_boundary("hello", 5), 5);
}
#[test]
fn over_len_clamps() {
assert_eq!(floor_char_boundary("hi", 99), 2);
}
#[test]
fn walks_back_to_boundary_in_multibyte() {
let s = "รฉ";
assert_eq!(s.len(), 2);
assert_eq!(floor_char_boundary(s, 1), 0);
assert_eq!(floor_char_boundary(s, 2), 2);
}
#[test]
fn four_byte_char() {
let s = "a๐b";
assert_eq!(floor_char_boundary(s, 4), 1);
assert_eq!(floor_char_boundary(s, 3), 1);
assert_eq!(floor_char_boundary(s, 2), 1);
assert_eq!(floor_char_boundary(s, 1), 1);
assert_eq!(floor_char_boundary(s, 0), 0);
}
#[test]
fn matches_std_floor_char_boundary_on_known_cases() {
let s = "โค๏ธ๐งก๐๐๐๐";
assert_eq!(s.len(), 26);
assert_eq!(floor_char_boundary(s, 13), 10);
assert_eq!(floor_char_boundary(s, 14), 14);
assert_eq!(floor_char_boundary(s, 15), 14);
assert_eq!(floor_char_boundary(s, 26), 26);
}
}