use disarm::api::{self, NormalizationForm};
#[test]
fn a_short_stack_is_untouched() {
let s = format!("a{}", "\u{0301}".repeat(29));
assert_eq!(api::stream_safe(&s), s);
}
#[test]
fn a_long_stack_gets_a_joiner() {
let s = format!("a{}", "\u{0301}".repeat(40));
let out = api::stream_safe(&s);
assert!(out.contains('\u{034F}'), "no CGJ inserted");
assert!(out.len() > s.len());
}
#[test]
fn it_is_not_canonically_equivalent() {
let s = format!("a{}", "\u{0301}".repeat(40));
let out = api::stream_safe(&s);
assert_ne!(out, s);
assert_ne!(
api::normalize(&out, NormalizationForm::Nfc),
api::normalize(&s, NormalizationForm::Nfc),
"stream_safe must not be mistaken for a normalization"
);
}
#[test]
fn ordinary_zalgo_is_below_the_bound() {
let zalgo = format!("a{}", "\u{0301}".repeat(8));
assert_eq!(api::stream_safe(&zalgo), zalgo);
}
#[test]
fn real_stacking_scripts_are_untouched() {
for s in [
"\u{05D0}\u{05B8}\u{05C1}\u{0591}",
"\u{0628}\u{064E}\u{0651}",
"\u{0915}\u{094D}\u{0937}",
] {
assert_eq!(api::stream_safe(s), s, "{s:?} was modified");
}
}
#[test]
fn the_predicate_is_a_conjunction() {
let decomposed = "a\u{0301}"; assert!(!api::is_normalized_stream_safe(
decomposed,
NormalizationForm::Nfc
));
assert!(api::is_normalized_stream_safe(
&api::normalize(decomposed, NormalizationForm::Nfc),
NormalizationForm::Nfc
));
}
#[test]
fn every_form_is_accepted() {
for form in [
NormalizationForm::Nfc,
NormalizationForm::Nfd,
NormalizationForm::Nfkc,
NormalizationForm::Nfkd,
] {
let _ = api::is_normalized_stream_safe("abc", form);
}
}
#[test]
fn ascii_is_a_no_op() {
assert_eq!(api::stream_safe("Hello world"), "Hello world");
assert!(api::is_normalized_stream_safe(
"Hello world",
NormalizationForm::Nfc
));
}