Files
Echo-Tavern/tests/test_state_machine.py
T
2026-03-08 09:16:44 +08:00

69 lines
2.5 KiB
Python

from __future__ import annotations
import json
def _ai_json(*, narration, add_clues=None, set_flags=None, danger_delta=0):
payload = {
"narration": narration,
"npc_dialogues": [{"npc": "老板", "line": "我在看着你们", "tone": "cold"}],
"state_updates": {
"danger_delta": danger_delta,
"add_clues": add_clues or [],
"set_flags": set_flags or {},
"npc_changes": {},
"inventory_add": {},
},
"private_player_updates": [],
"choices": ["继续调查", "与NPC交谈"],
"should_end_scene": False,
"should_end_game": False,
"ending_summary": None,
}
return json.dumps(payload, ensure_ascii=False)
def test_state_machine_start_progress_end(room_manager, persistence):
created = room_manager.create_room("Host")
room_id = created["room_id"]
host_id = created["player_id"]
room_manager.start_game(room_id, host_id)
snapshot = room_manager.get_snapshot(room_id)
assert snapshot["status"] == "running"
assert snapshot["game_state"]["game_phase"] == "running"
responses = [
_ai_json(narration="你们在大厅发现被撕毁的船务清单。", add_clues=["torn_manifest"]),
_ai_json(
narration="餐厅里传来钟铃声,301 房门钥匙的线索浮现。",
add_clues=["silver_bell"],
set_flags={"room_301_unlocked": True},
),
_ai_json(narration="走廊尽头客房内找到女仆日记。", add_clues=["maid_diary"]),
_ai_json(
narration="地下室入口出现,你们洞悉真相并找到逃生通道。",
add_clues=["cellar_sigil", "bloodied_key"],
set_flags={"cellar_entry_found": True, "truth_revealed": True, "escape_route_open": True},
),
]
def fake_chat_json(messages, temperature=0.6, max_tokens=800):
return {"ok": True, "content": responses.pop(0)}
room_manager.deepseek_client.chat_json = fake_chat_json
for i in range(4):
room_manager.submit_action(room_id, host_id, f"第{i + 1}轮行动")
room_manager.resolve_round(room_id, host_id)
final_snapshot = room_manager.get_snapshot(room_id)
game_state = final_snapshot["game_state"]
assert game_state["game_phase"] == "ended"
assert game_state["ending_state"] == "escaped"
assert game_state["scene_id"] == "basement"
assert len(game_state["discovered_clues"]) >= 4
room = persistence.get_room(room_id)
assert room["status"] == "ended"