okpyeon 0.1.0

Korean IME candidate data: hangul reading -> hanja candidates with hun-eum glosses (옥편), plus the MS-IME-style consonant -> special-symbol tables (ㅁ + 한자). Data from libhangul, single-character lookups only.
Documentation
//! 벤더링된 데이터가 알려진 사실과 일치하는지 공개 API로 검증한다.

#[test]
fn common_hanja_come_first() {
    assert_eq!(okpyeon::hanja('').unwrap()[0], ('', "배울 학"));
    assert_eq!(okpyeon::hanja('').unwrap()[0], ('', "나라 국"));
    assert_eq!(okpyeon::hanja('').unwrap()[0], ('', "물 수, 고를 수"));
}

#[test]
fn absent_hanja_readings() {
    assert_eq!(okpyeon::hanja('A'), None);
    assert_eq!(okpyeon::hanja(''), None);
}

#[test]
fn msime_symbol_categories() {
    let get = |c| okpyeon::symbols(c).unwrap();
    assert!(get('').contains(&''), "ㄱ = punctuation");
    assert!(get('').contains(&''), "ㄴ = brackets");
    assert!(get('').contains(&'±'), "ㄷ = math");
    assert!(get('').contains(&''), "ㄹ = units");
    assert!(get('').contains(&''), "ㅁ = general symbols");
    assert!(get('').contains(&''), "ㅁ = general symbols");
    assert!(get('').contains(&''), "ㅂ = box drawing");
    assert!(get('').contains(&'α'), "ㅎ = greek");
    assert!(get('').contains(&''), "ㄸ = hiragana");
    assert!(get('').contains(&'А'), "ㅆ = cyrillic");
}

#[test]
fn tteung_has_no_symbols_like_msime() {
    assert_eq!(okpyeon::symbols(''), None);
    assert_eq!(okpyeon::symbols_revised(''), None);
}

#[test]
fn revised_differs_only_in_documented_quirks() {
    // ㄹ: 중복 전각 F 자리가 °로 교체된다.
    let rieul = okpyeon::symbols('').unwrap();
    let rieul_rev = okpyeon::symbols_revised('').unwrap();
    assert_eq!(rieul[3], '');
    assert_eq!(rieul_rev[3], '°');
    assert_eq!(rieul.len(), rieul_rev.len());
    assert!(rieul
        .iter()
        .zip(rieul_rev.iter())
        .enumerate()
        .all(|(i, (a, b))| i == 3 || a == b));

    // ㅁ: 맨 끝에 ㉾가 추가된다.
    let mieum = okpyeon::symbols('').unwrap();
    let mieum_rev = okpyeon::symbols_revised('').unwrap();
    assert!(!mieum.contains(&''));
    assert_eq!(mieum_rev.last(), Some(&''));
    assert_eq!(mieum_rev.len(), mieum.len() + 1);
    assert_eq!(&mieum_rev[..mieum.len()], mieum);

    // 나머지 16키는 완전히 동일하다.
    for key in "ㄱㄲㄴㄷㄸㅂㅃㅅㅆㅇㅈㅊㅋㅌㅍㅎ".chars() {
        assert_eq!(
            okpyeon::symbols(key).unwrap(),
            okpyeon::symbols_revised(key).unwrap(),
            "unexpected revision at {key}"
        );
    }
}