from genesis.memory.retrieval import (
    Candidate,
    RetrievalWeights,
    rank,
    recency_score,
)


def test_recency_decays_over_time():
    assert recency_score(0) == 1.0
    assert recency_score(10) > recency_score(100)
    assert 0.0 < recency_score(100) < 1.0


def test_recency_negative_elapsed_is_fresh():
    assert recency_score(-5) == 1.0


def test_rank_orders_by_combined_score():
    cands = [
        Candidate(item="low", relevance=0.1, recency=0.1, importance=0.1),
        Candidate(item="high", relevance=0.9, recency=0.9, importance=0.9),
        Candidate(item="mid", relevance=0.5, recency=0.5, importance=0.5),
    ]
    order = [r.item for r in rank(cands)]
    assert order == ["high", "mid", "low"]


def test_importance_can_outweigh_relevance():
    # 相关度低但重要度极高的记忆应能胜出(里程碑不被淹没)
    cands = [
        Candidate(item="relevant_trivial", relevance=1.0, recency=1.0, importance=0.0),
        Candidate(item="milestone", relevance=0.0, recency=1.0, importance=1.0),
    ]
    weights = RetrievalWeights(relevance=1.0, recency=0.0, importance=3.0)
    top = rank(cands, weights)[0].item
    assert top == "milestone"


def test_rank_empty():
    assert rank([]) == []
