kernal-api 0.1.21

Async OS HAL, profiling, symbolization, and allocator instrumentation
#![cfg(feature = "text-similarity")]

use kernal_api::text::{name_similarity, SimilarityError};

#[test]
fn known_scores_and_unicode_semantics() {
    assert!((name_similarity("MARTHA", "MARHTA").unwrap() - 0.9611111111111111).abs() < 1e-12);
    assert_eq!(name_similarity("", "").unwrap(), 1.0);
    assert_eq!(name_similarity("", "x").unwrap(), 0.0);
    assert_eq!(name_similarity("é🦀", "é🦀").unwrap(), 1.0);
    assert_eq!(name_similarity("abc", "XYZ").unwrap(), 0.0);
    assert!(name_similarity("é", "e\u{301}").unwrap() < 1.0);
}

#[test]
fn rejects_storage_and_comparison_work_before_scoring() {
    assert_eq!(
        name_similarity(&"x".repeat(4097), "x"),
        Err(SimilarityError::InputTooLarge)
    );
    assert_eq!(
        name_similarity(&"x".repeat(1025), &"y".repeat(1024)),
        Err(SimilarityError::WorkLimitExceeded)
    );
    assert!(name_similarity(&"🦀".repeat(1024), "🦀").unwrap() > 0.0);
    assert_eq!(
        name_similarity(&"x".repeat(1024), &"x".repeat(1024)).unwrap(),
        1.0
    );
    assert_eq!(name_similarity(&"x".repeat(4096), "").unwrap(), 0.0);
}

#[test]
fn scores_are_finite_normalized_and_symmetric_for_representative_names() {
    for left in ["", "Blink", "blnk", "Fire2012", "é🦀", "e\u{301}"] {
        for right in ["", "Blink", "blnk", "Fire2012", "é🦀", "e\u{301}"] {
            let score = name_similarity(left, right).unwrap();
            assert!(score.is_finite() && (0.0..=1.0).contains(&score));
            assert!((score - name_similarity(right, left).unwrap()).abs() < 1e-12);
        }
    }
}