dream-customs / tests /test_schema.py
ADJCJH's picture
Refine Dream QA waking tips and weird actions (#37)
76843bd
Raw
History Blame Contribute Delete
5.25 kB
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