use gilt::cells::{cell_len, set_cell_size};
use gilt::style::Style;
use gilt::text::{OverflowMethod, Text};
#[test]
fn cell_len_zwj_family_emoji_is_2() {
let s = "π¨\u{200d}π©\u{200d}π§";
assert_eq!(cell_len(s), 2);
}
#[test]
fn cell_len_us_flag_is_2() {
let s = "\u{1F1FA}\u{1F1F8}";
assert_eq!(cell_len(s), 2);
}
#[test]
fn cell_len_combining_acute_is_4() {
let s = "cafe\u{0301}";
assert_eq!(cell_len(s), 4);
}
#[test]
fn cell_len_hangul_composed_is_4() {
let s = "νκΈ";
assert_eq!(cell_len(s), 4);
}
#[test]
fn cell_len_variation_selector_heart_is_2() {
let s = "\u{2764}\u{FE0F}";
assert_eq!(cell_len(s), 2);
}
#[test]
fn set_cell_size_truncates_before_zwj_cluster() {
let s = "π¨\u{200d}π©\u{200d}π§ family";
let cropped = set_cell_size(s, 4);
assert!(
cropped.contains("π¨\u{200d}π©\u{200d}π§") || !cropped.contains("\u{200d}"),
"expected full family or no orphan ZWJ, got {:?}",
cropped
);
assert_eq!(cell_len(&cropped), 4);
}
#[test]
fn set_cell_size_truncates_before_flag() {
let s = "\u{1F1FA}\u{1F1F8} USA";
let cropped = set_cell_size(s, 1);
assert_eq!(cell_len(&cropped), 1);
assert!(!cropped.contains('\u{1F1FA}') || cropped.contains('\u{1F1F8}'));
}
#[test]
fn set_cell_size_keeps_combining_marks_with_their_base() {
let s = "cafe\u{0301}";
let cropped = set_cell_size(s, 4);
assert_eq!(cell_len(&cropped), 4);
assert!(cropped.contains("e\u{0301}") || !cropped.contains('\u{0301}'));
}
#[test]
fn set_cell_size_pure_ascii_unchanged() {
assert_eq!(set_cell_size("hello", 5), "hello");
assert_eq!(set_cell_size("hello", 3), "hel");
assert_eq!(set_cell_size("hi", 5), "hi ");
}
#[test]
fn text_truncate_keeps_zwj_family_intact_when_it_fits() {
let mut t = Text::new("π¨\u{200d}π©\u{200d}π§ family", Style::null());
t.truncate(4, Some(OverflowMethod::Crop), false);
let plain = t.plain().to_string();
assert!(
plain.contains("π¨\u{200d}π©\u{200d}π§"),
"truncate dropped or split the ZWJ family: {:?}",
plain
);
}
#[test]
fn text_truncate_no_dangling_zwj() {
let mut t = Text::new("π¨\u{200d}π©\u{200d}π§ family", Style::null());
t.truncate(3, Some(OverflowMethod::Crop), false);
let plain = t.plain().to_string();
let has_family = plain.contains("π¨\u{200d}π©\u{200d}π§");
let has_orphan_zwj = !has_family && plain.contains('\u{200d}');
assert!(!has_orphan_zwj, "truncate left an orphan ZWJ: {:?}", plain);
}