use disarm::api;
#[test]
fn confusables() {
assert_eq!(
api::normalize_confusables("\u{0430}pple", api::TargetScript::Latin),
"apple"
);
assert!(api::is_confusable(
"p\u{0430}ypal",
api::TargetScript::Latin
));
}
#[test]
fn width_and_graphemes() {
assert_eq!(api::terminal_width("世界", false), 4);
assert_eq!(api::grapheme_width("a", false), 1);
assert_eq!(api::grapheme_len("café"), 4);
assert_eq!(api::grapheme_split("ab").len(), 2);
assert_eq!(api::grapheme_truncate("hello", 3), "hel");
}
#[test]
fn text_cleanup() {
assert_eq!(api::collapse_whitespace("a b", true, true), "a b");
assert_eq!(api::strip_control_chars("a\rb"), "ab");
assert_eq!(api::strip_zero_width_chars("a\u{200b}b"), "ab");
assert!(!api::is_zalgo("hi", 3));
assert_eq!(api::strip_zalgo("a", 2), "a");
assert_eq!(api::fold_case("ß"), "ss");
}
#[test]
fn normalization() {
assert_eq!(
api::normalize("cafe\u{0301}", api::NormalizationForm::Nfc),
"café"
);
assert!(api::is_normalized("café", api::NormalizationForm::Nfc));
}
#[test]
fn encoders() {
assert_eq!(api::escape_html("<a>"), "<a>");
assert_eq!(
api::percent_encode("a b", api::UrlComponent::Query),
"a%20b"
);
}
#[test]
fn reverse_and_scripts() {
assert!(api::reverse_langs().iter().any(|l| l == "ru"));
let _ = api::reverse_transliterate("privet", api::ReverseLang::Russian);
assert!(api::detect_scripts("hello").contains(&"Latin"));
assert!(!api::is_mixed_script("hello"));
let _ = api::inspect_auto_lang("hello");
}
#[test]
fn filename_fallible() {
assert_eq!(
api::sanitize_filename("a/b", "_", 255, api::Platform::Posix, None, true).unwrap(),
"a_b"
);
let err = api::sanitize_filename("x", "_", 255, api::Platform::Universal, Some("zzz"), true)
.unwrap_err();
assert_eq!(err.kind(), disarm::ErrorKind::InvalidArgument);
}
#[test]
fn log_injection_fallible() {
assert_eq!(
api::strip_log_injection("a\r\nb", "?", false).unwrap(),
"a??b"
);
assert!(api::strip_log_injection("x", "\r", false).is_err());
}
#[test]
fn encoding_fallible() {
let decoded =
api::decode_to_utf8(&[0x63, 0x61, 0x66, 0xE9], Some("ISO-8859-1"), 0.0, false).unwrap();
assert_eq!(decoded.text, "café");
assert!(api::decode_to_utf8(b"x", Some("FAKE-999"), 0.0, false).is_err());
let det = api::detect_encoding(b"hello world");
assert!(!det.label.is_empty() && det.confidence > 0.0);
}
#[test]
fn slugification() {
assert_eq!(
api::slugify("Héllo Wörld", &api::SlugConfig::default()),
"hello-world"
);
}
#[test]
fn transliteration() {
use api::{OnUnknown, Scheme, Transliterate};
assert_eq!(api::transliterate("hello"), "hello");
let out = Transliterate::new()
.scheme(Scheme::StrictIso9)
.on_unknown(OnUnknown::Replace("?".into()))
.run("Москва");
assert!(out.is_ascii() && !out.is_empty());
assert_eq!(api::strip_accents("café"), "cafe");
assert!(api::is_ascii("hi") && !api::is_ascii("café"));
assert!(api::list_langs().iter().any(|l| l == "ru"));
assert!(Transliterate::new().find_untranslatable("hi").is_empty());
}
#[test]
fn presets_and_pipeline() {
assert!(api::security_clean("hello").is_ok());
let _ = api::display_clean("hello");
let _ = api::strip_bidi("hello");
assert!(api::list_profiles().iter().all(|p| !p.is_empty()));
}
#[test]
fn hostname() {
let analysis = api::is_suspicious_hostname("example.com");
assert!(!analysis.suspicious);
assert_eq!(analysis.canonical, "example.com");
let spoof = api::is_suspicious_hostname("p\u{0430}ypal.com");
assert!(spoof.suspicious);
}
#[test]
fn emoji() {
assert_eq!(api::demojize("hi", false), "hi");
}