chars 0.7.0

A commandline tool to display information about unicode characters
Documentation
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);
    }
}