tinycortex 0.1.1

Rust core for the TinyCortex memory system
Documentation
use super::*;

#[test]
fn relation_rule_normalizes_supported_predicates() {
    let owns = relation_rule("works_on").unwrap();
    assert_eq!(owns.canonical, "OWNS");
    assert_eq!(owns.allowed_head, PERSON_TYPES);

    let prefers = relation_rule("prefers").unwrap();
    assert_eq!(prefers.canonical, "PREFERS");

    let deadline = relation_rule("due_on").unwrap();
    assert_eq!(deadline.canonical, "HAS_DEADLINE");
}

#[test]
fn type_allowed_honors_allowlist_and_empty_list() {
    assert!(type_allowed("PERSON", PERSON_TYPES));
    assert!(!type_allowed("PROJECT", PERSON_TYPES));
    assert!(type_allowed("ANYTHING", &[]));
}

#[test]
fn resolve_person_alias_uses_known_people_map() {
    let mut known = std::collections::HashMap::new();
    known.insert("ALICE".to_string(), "ALICE SMITH".to_string());
    assert_eq!(resolve_person_alias("ALICE", &known), "ALICE SMITH");
    assert_eq!(resolve_person_alias("BOB", &known), "BOB");
}

#[test]
fn add_entity_tracks_highest_confidence_and_person_aliases() {
    let mut acc = ExtractionAccumulator::default();
    let first = acc.add_entity("Alice Smith", "PERSON", 0.6).unwrap();
    let second = acc.add_entity("Alice Smith", "PERSON", 0.9).unwrap();
    assert_eq!(first, "ALICE SMITH");
    assert_eq!(second, "ALICE SMITH");
    assert_eq!(acc.entities["ALICE SMITH"].confidence, 0.9);
    assert_eq!(
        acc.known_people.get("ALICE").map(String::as_str),
        Some("ALICE SMITH")
    );
}

#[test]
fn add_relation_rejects_invalid_or_self_relations() {
    let mut acc = ExtractionAccumulator::default();
    acc.add_relation(
        "Alice",
        "PERSON",
        "owns",
        "Alice",
        "PERSON",
        0.8,
        0,
        0,
        Map::new(),
    );
    assert!(acc.relations.is_empty(), "self relation should be dropped");

    acc.add_relation(
        "Alice",
        "PERSON",
        "unknown_predicate",
        "Project X",
        "PROJECT",
        0.8,
        0,
        0,
        Map::new(),
    );
    assert!(
        acc.relations.is_empty(),
        "unknown predicate should be ignored"
    );
}

#[test]
fn add_relation_canonicalizes_predicate_and_collects_chunk_index() {
    let mut acc = ExtractionAccumulator::default();
    acc.add_relation(
        "Alice",
        "PERSON",
        "works_on",
        "Phoenix",
        "PROJECT",
        0.8,
        3,
        11,
        Map::new(),
    );
    assert_eq!(acc.relations.len(), 1);
    let relation = &acc.relations[0];
    assert_eq!(relation.predicate, "OWNS");
    assert_eq!(relation.subject, "ALICE");
    assert_eq!(relation.object, "PHOENIX");
    assert!(relation.chunk_indexes.contains(&3));
    assert_eq!(relation.order_index, 11);
}