71 lines
2.4 KiB
Python
71 lines
2.4 KiB
Python
"""感慨触发纯函数测试(辰正 §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"
|