"""小周天每轮反思抽取纯函数测试。""" from app.modules.extraction.extract import MemoryCandidateDraft from app.modules.reflection.extract import parse_reflection def test_parse_standard() -> None: raw = ( '{"memories":[{"type":"preference","title":"喜欢简洁","content":"用户偏好简洁",' '"importance":0.8,"sensitivity":"low","confidence":0.7,"reason":"多次提及"}],' '"reflection":"本轮应更主动确认用户意图。"}' ) memories, reflection = parse_reflection(raw) assert len(memories) == 1 assert memories[0].title == "喜欢简洁" assert isinstance(memories[0], MemoryCandidateDraft) assert reflection == "本轮应更主动确认用户意图。" def test_parse_markdown_block() -> None: raw = '```json\n{"memories":[],"reflection":"反思文本"}\n```' memories, reflection = parse_reflection(raw) assert memories == [] assert reflection == "反思文本" def test_parse_invalid_returns_empty() -> None: assert parse_reflection("不是JSON") == ([], "") assert parse_reflection("[]") == ([], "") def test_missing_reflection_returns_empty_string() -> None: memories, reflection = parse_reflection('{"memories":[]}') assert memories == [] assert reflection == "" def test_missing_memories_returns_empty_list() -> None: memories, reflection = parse_reflection('{"reflection":"只有反思"}') assert memories == [] assert reflection == "只有反思" def test_memory_safe_defaults() -> None: raw = '{"memories":[{"title":"t","content":"c"}],"reflection":"r"}' m = parse_reflection(raw)[0][0] assert m.sensitivity == "low" assert m.confidence == 0.5 assert m.importance == 0.5 def test_skip_memory_missing_title_or_content() -> None: raw = ( '{"memories":[{"title":"t"},{"content":"c"},{"title":"t","content":"c"}],"reflection":"r"}' ) assert len(parse_reflection(raw)[0]) == 1 def test_clamp_values() -> None: raw = '{"memories":[{"title":"t","content":"c","importance":1.5}],"reflection":"r"}' assert parse_reflection(raw)[0][0].importance == 1.0 def test_reflection_strips_whitespace() -> None: raw = '{"memories":[],"reflection":" 带空格的反思 "}' assert parse_reflection(raw)[1] == "带空格的反思"