use super::*;
use crate::Char;
#[test]
fn char_grapheme() {
let ch = 'A';
let mut chars = ch.grapheme_chars();
assert_eq!(chars.next(), Some('A'));
assert_eq!(chars.next(), None);
assert_eq!(ch.grapheme_len_bytes(), 1); assert_eq!('€'.grapheme_len_bytes(), 2); assert_eq!('𐍈'.grapheme_len_bytes(), 3);
assert_eq!(ch.grapheme_len_utf8(), 1); assert_eq!('€'.grapheme_len_utf8(), 3); assert_eq!('𐍈'.grapheme_len_utf8(), 4);
assert_eq!(ch.grapheme_len_chars(), 1);
}
#[test]
fn char_kind() {
let ch = 'A';
assert_eq!(ch.grapheme_kind(), GraphemeKind::char);
assert!(ch.grapheme_is_kind(GraphemeKind::char));
assert!(!ch.grapheme_is_kind(GraphemeKind::Nonul));
}
#[test]
fn unicode_chars() {
let test_cases = [
('A', 1, 1, 1), ('ß', 1, 2, 1), ('€', 2, 3, 1), ('𐍈', 3, 4, 1), ];
for (ch, expected_bytes, expected_utf8, expected_chars) in test_cases {
assert_eq!(ch.grapheme_len_bytes(), expected_bytes);
assert_eq!(ch.grapheme_len_utf8(), expected_utf8);
assert_eq!(ch.grapheme_len_chars(), expected_chars);
let mut iter = ch.grapheme_chars();
assert_eq!(iter.next(), Some(ch));
assert_eq!(iter.next(), None);
}
}
#[test]
fn char_iterator_properties() {
let ch = '🦀';
let mut iter = ch.grapheme_chars();
assert_eq!(iter.next(), Some('🦀'));
assert_eq!(iter.next(), None);
let iter = ch.grapheme_chars();
let (min, max) = iter.size_hint();
assert_eq!(min, 1);
assert_eq!(max, Some(1));
}
#[test]
fn grapheme_trait_consistency() {
let test_chars = ['a', 'β', '🎉', '字'];
for ch in test_chars {
let iter_count = ch.grapheme_chars().count();
let method_count = ch.grapheme_len_chars();
assert_eq!(iter_count, method_count);
assert_eq!(ch.grapheme_len_bytes(), Char(ch as u32).len_bytes());
assert_eq!(ch.grapheme_len_utf8(), Char(ch).len_utf8());
assert_eq!(ch.grapheme_kind(), GraphemeKind::char);
}
}
#[test]
fn trait_object_compatibility() {
fn process_grapheme(g: impl Grapheme) -> usize {
g.grapheme_len_utf8()
}
assert_eq!(process_grapheme('A'), 1);
assert_eq!(process_grapheme('€'), 3);
}