kmp-domain 0.18.0

Domain model of the Kernel Memory Protocol: aggregates, value objects, repositories and projections, with no IO
Documentation
use super::{dropped_identifiers, identifiers, surface_tokens};

#[test]
fn full_named_dates_and_iso_preserve_the_same_calendar_day() {
    for source in [
        "17 de agosto de 2026",
        "August 17, 2026",
        "17 August 2026",
        "2026-08-17",
    ] {
        for rendering in ["2026-08-17", "August 17, 2026", "17 August 2026"] {
            assert!(
                dropped_identifiers(source, rendering).is_empty(),
                "{source} -> {rendering}"
            );
        }
    }
    assert!(dropped_identifiers("el 5 de septiembre de 2026", "on 2026-09-05").is_empty());
}

#[test]
fn changing_or_dropping_any_component_drops_the_whole_date() {
    for rendering in [
        "2026-09-17",
        "2026-08-18",
        "2027-08-17",
        "August 17",
        "2026",
        "17 2026",
    ] {
        assert_eq!(
            dropped_identifiers("17 de agosto de 2026", rendering),
            ["2026-08-17"]
        );
    }
}

#[test]
fn numbers_outside_the_date_cannot_be_hidden_inside_it() {
    assert_eq!(
        dropped_identifiers(
            "El 17 de agosto de 2026 costó 17 EUR (#469, v0.7.0).",
            "On 2026-08-17 the fee was EUR."
        ),
        ["#469", "17", "v0.7.0"]
    );
    assert!(
        dropped_identifiers(
            "17 de agosto de 2026, 17 EUR (#469, v0.7.0)",
            "2026-08-17, 17 EUR (#469, v0.7.0)"
        )
        .is_empty()
    );
}

#[test]
fn unsupported_or_invalid_dates_keep_literal_identifiers() {
    for (source, target) in [
        ("29 de febrero de 2026", "2026-02-29"),
        ("29 de febrero de 1900", "1900-02-29"),
        ("31 de abril de 2026", "2026-04-31"),
        ("0 de agosto de 2026", "2026-08-00"),
        ("17 de agosto de 0000", "0000-08-17"),
        ("17/08/2026", "2026-08-17"),
    ] {
        assert!(!dropped_identifiers(source, target).is_empty(), "{source}");
    }
    for year in [2000, 2024] {
        assert!(
            dropped_identifiers(
                &format!("29 de febrero de {year}"),
                &format!("{year}-02-29")
            )
            .is_empty()
        );
    }
}

#[test]
fn date_folding_does_not_change_search_or_stored_tokenization() {
    assert_eq!(
        identifiers("17 de agosto de 2026")
            .into_iter()
            .collect::<Vec<_>>(),
        ["17", "2026"]
    );
    assert!(surface_tokens("August 17, 2026").contains("august"));
    assert_eq!(
        dropped_identifiers("ADR kmp-mcp @rachel #469 09:00 UTC", "Other words"),
        ["#469", "09:00", "@rachel", "adr", "kmp-mcp", "utc"]
    );
}