| from dream_customs.schema import CustomsSession, DreamIntake, EvidenceItem, PactCard, TodayTipCard | |
| def test_dream_intake_defaults_lists(): | |
| intake = DreamIntake(dream_text="I missed an elevator.") | |
| assert intake.dream_text == "I missed an elevator." | |
| assert intake.visual_clues == [] | |
| assert intake.recurring_symbols == [] | |
| def test_dream_intake_merged_text_includes_modalities(): | |
| intake = DreamIntake( | |
| dream_text="I missed an elevator.", | |
| voice_transcript="The buttons melted.", | |
| visual_clues=["blue hallway"], | |
| mood="anxious", | |
| recurring_symbols=["elevator"], | |
| user_context="I slept badly.", | |
| ) | |
| merged = intake.merged_text() | |
| assert "I missed an elevator." in merged | |
| assert "The buttons melted." in merged | |
| assert "blue hallway" in merged | |
| assert "Mood: anxious" in merged | |
| def test_pact_card_requires_core_fields(): | |
| card = PactCard( | |
| visitor_name="Late Elevator", | |
| permit_id="DC-0001", | |
| contraband=["unfiled anxiety"], | |
| risk_level="orange", | |
| alliance_reading="The dream asks for a smaller start.", | |
| practical_suggestion="Open one task ten minutes early.", | |
| weird_task="Write the elevator an apology note.", | |
| bedtime_release="Today the elevator has docked.", | |
| ) | |
| assert card.safety_note == "" | |
| assert "Late Elevator" in card.to_plain_text() | |
| def test_today_tip_plain_text_uses_weird_little_thing_label(): | |
| card = TodayTipCard( | |
| dream_summary="你梦见办公楼、电梯和邮件。", | |
| main_question="为什么会卡住?", | |
| dream_anchors=["办公楼", "电梯", "邮件"], | |
| interpretation="也许这是一个开始被放大的画面。", | |
| today_tip="1. 在现实里打开邮件草稿。2. 只写第一句话。", | |
| tiny_action="画一个草稿层按钮,按一下再开始。", | |
| ) | |
| text = card.to_plain_text() | |
| assert "古怪的小事:" in text | |
| assert "没试过的小事:" not in text | |
| def test_customs_session_defaults_to_empty_workbench(): | |
| session = CustomsSession() | |
| assert session.phase == "empty" | |
| assert session.evidence_items == [] | |
| assert session.question_history == [] | |
| assert session.evidence_count() == 0 | |
| def test_evidence_item_tracks_failure_state(): | |
| item = EvidenceItem(type="image", label="Image evidence", status="failed", error="No clues extracted") | |
| assert item.type == "image" | |
| assert item.status == "failed" | |
| assert "No clues" in item.error | |
| from dream_customs.schema import DreamBrief, PactCritique, VisionWitness | |
| def test_vision_witness_flattens_report_into_demo_clues(): | |
| witness = VisionWitness( | |
| scene_summary="A hand-drawn elevator panel is stuck on floor 14.", | |
| objects=["elevator button", "wax"], | |
| visible_text=["14"], | |
| spatial_relations=["button below the frozen number"], | |
| mood_cues=["stuck", "cold"], | |
| uncertain_details=["whether the floor is a basement"], | |
| surprising_detail="The buttons look melted rather than broken.", | |
| ) | |
| clues = witness.to_visual_clues() | |
| assert clues[0] == "Scene: A hand-drawn elevator panel is stuck on floor 14." | |
| assert "Object: elevator button" in clues | |
| assert "Visible text: 14" in clues | |
| assert "Spatial relation: button below the frozen number" in clues | |
| assert "Mood cue: stuck" in clues | |
| assert "Uncertain detail: whether the floor is a basement" in clues | |
| assert "Surprising detail: The buttons look melted rather than broken." in clues | |
| def test_vision_witness_limits_visual_clues_for_demo(): | |
| witness = VisionWitness( | |
| scene_summary="A long witness report.", | |
| objects=[f"object {index}" for index in range(6)], | |
| visible_text=[f"text {index}" for index in range(4)], | |
| spatial_relations=["near the door", "under the clock"], | |
| mood_cues=["bright", "cold"], | |
| uncertain_details=["which room it is"], | |
| surprising_detail="A tiny moon is taped to the wall.", | |
| ) | |
| assert len(witness.to_visual_clues()) == 12 | |
| def test_dream_brief_carries_evidence_and_demo_language(): | |
| brief = DreamBrief( | |
| anchors=["elevator", "melted wax", "floor 14"], | |
| emotional_hypothesis="The dream may be protecting a fear of getting stuck.", | |
| today_bridge="Choose one stalled task and name the next small movement.", | |
| visual_evidence=["Visible text: 14"], | |
| safety_flags=[], | |
| language="en", | |
| ) | |
| assert brief.language == "en" | |
| assert "floor 14" in brief.anchors | |
| assert brief.visual_evidence == ["Visible text: 14"] | |
| def test_dream_brief_defaults_to_demo_language_and_empty_lists(): | |
| brief = DreamBrief() | |
| assert brief.language == "en" | |
| assert brief.anchors == [] | |
| assert brief.visual_evidence == [] | |
| assert brief.safety_flags == [] | |
| def test_pact_critique_flags_template_and_grammar_failures(): | |
| critique = PactCritique( | |
| passes=False, | |
| issues=["repeated article", "template fallback"], | |
| rewrite_instruction="Rewrite in natural English using elevator, wax, and floor 14.", | |
| ) | |
| assert not critique.passes | |
| assert "repeated article" in critique.issues | |
| assert "natural English" in critique.rewrite_instruction | |