"""感慨触发纯函数测试(辰正 §7.2)。""" from app.modules.time_sense.sentiment import SentimentInput, detect_sentiment from app.modules.time_sense.snapshot import TemporalSnapshot def _snapshot(**overrides) -> TemporalSnapshot: """复用 modulation 测试的快照构造思路:构造最小可用 snapshot。""" from tests.modules.time_sense.test_modulation import _snapshot as _base_snapshot return _base_snapshot(**overrides) def test_duration_node_trigger(): snap = _snapshot() signals = SentimentInput(duration_days=100, duration_nodes={100, 365}) assert detect_sentiment(snap, signals) == "duration_node" def test_anniversary_prewarm_trigger(): snap = _snapshot() signals = SentimentInput(duration_days=50, next_milestone_days=5, prewarm_days=7) assert detect_sentiment(snap, signals) == "anniversary_prewarm" def test_anniversary_prewarm_not_today(): # next_milestone_days=0 表示今日命中(active_milestone),不算 prewarm snap = _snapshot() signals = SentimentInput(duration_days=50, next_milestone_days=0, prewarm_days=7) assert detect_sentiment(snap, signals) != "anniversary_prewarm" def test_reunion_memory_trigger(): snap = _snapshot() signals = SentimentInput(duration_days=10, is_reunion=True, has_reunion_memory=True) assert detect_sentiment(snap, signals) == "reunion_memory" def test_late_night_overlay_trigger(): snap = _snapshot(day_period="凌晨") signals = SentimentInput(duration_days=10, is_reunion=True) assert detect_sentiment(snap, signals) == "late_night_overlay" def test_solar_term_trigger(): from app.modules.time_sense.lunar import SolarTermInfo snap = _snapshot( solar_term=SolarTermInfo(current_name="立春", next_name="雨水", days_to_next=15) ) signals = SentimentInput(duration_days=10, strong_solar_terms={"立春"}) assert detect_sentiment(snap, signals) == "solar_term" def test_no_trigger_returns_none(): snap = _snapshot() signals = SentimentInput(duration_days=10) assert detect_sentiment(snap, signals) is None def test_priority_duration_over_prewarm(): """认识 100 天且距周年 3 天 → duration_node 优先。""" snap = _snapshot() signals = SentimentInput( duration_days=100, next_milestone_days=3, duration_nodes={100}, prewarm_days=7, ) assert detect_sentiment(snap, signals) == "duration_node"