use chars::human_names;
use proptest::prelude::*;
use std::fmt::Write;
fn diagnostics(ch: char, query: &str) -> String {
format!(
"char: {:?} / {}, query: {:?}; maybe `make fetch` needs to be run",
ch,
ch.escape_unicode(),
query
)
}
proptest! {
#![proptest_config(ProptestConfig::with_cases(100_000))]
#[test]
fn find_any_by_identity(ch in prop::char::any()) {
let mut chstr = String::new();
chstr.write_char(ch).unwrap();
let found = human_names::from_arg(&chstr);
assert!(!found.is_empty());
assert!(found.contains(&ch));
}
#[test]
fn find_by_name(ch in prop::char::any().prop_filter("Must have a name",
|c| unicode_names2::name(*c).is_some())) {
let query = unicode_names2::name(ch).unwrap().to_string();
let found = human_names::from_arg(&query);
assert!(!found.is_empty(), "{}", diagnostics(ch, &query));
assert!(found.contains(&ch), "{}", diagnostics(ch, &query));
}
#[test]
fn find_any_by_hex(ch in prop::char::any()) {
let num = ch as u32;
let query = format!("0x{:04x}", num);
let found = human_names::from_arg(&query);
println!("num: {:?}", num);
assert_eq!(found.len(), 1, "{}", diagnostics(ch, &query));
assert_eq!(found[0], ch, "{}", diagnostics(ch, &query));
let query = format!("U+{:04x}", num);
let found = human_names::from_arg(&query);
assert_eq!(found.len(), 1, "{}", diagnostics(ch, &query));
assert_eq!(found[0], ch, "{}", diagnostics(ch, &query));
let query = format!("{:04x}", num);
let found = human_names::from_arg(&query);
assert!(!found.is_empty(), "{}", diagnostics(ch, &query));
assert!(found.contains(&ch), "{}", diagnostics(ch, &query));
}
#[test]
fn find_control_chars(ch in prop::char::range(0 as char, 0x1f as char)) {
let query = format!("^{}", (b'@' + (ch as u8 & 0x1f)) as char);
let found = human_names::from_arg(&query);
assert_eq!(found.len(), 1, "nothing found for query: {:?}", query);
assert_eq!(found[0], ch, "query: {:?}", query);
}
}