- Fase 0: env var allineate, SYSTEM_PROMPT deduplicato, .gitignore pulito - Fase 1: GameContext isolato, ciclo DM unificato, provider thread-safe (contextvars) - Fase 2: DB schema esteso (current_area_id, combat_state, character_items) - Fase 3: thread-local connection pool + WAL + busy_timeout - Fase 4: test suite (32 test, 100% pass) - heuristic_fallback come parser di riserva (non secondo pilota)
141 lines
3.8 KiB
Python
141 lines
3.8 KiB
Python
import sys
|
|
import json
|
|
sys.path.insert(0, "src")
|
|
|
|
from src.engine.tools import run
|
|
from src.engine.db import init_db, create_campaign, create_character, update_character
|
|
|
|
|
|
def _setup_char():
|
|
conn = init_db()
|
|
camp_id = create_campaign("Test", "Avventura")
|
|
char_id = create_character(camp_id, "TestChar", "guerriero", "soldato")
|
|
update_character(
|
|
char_id,
|
|
level=1, str=15, agi=11, sta=14,
|
|
per=9, int=8, lck=10,
|
|
hp_current=12, hp_max=12, ac=15,
|
|
armor_type="light",
|
|
)
|
|
return camp_id, char_id
|
|
|
|
|
|
def test_roll_dice_tool():
|
|
r = run("roll_dice", die="d20")
|
|
assert r["success"] is True
|
|
assert r["tool"] == "roll-dice"
|
|
assert 1 <= r["total"] <= 20
|
|
|
|
|
|
def test_dice_chain_tool():
|
|
r = run("dice_chain", die="d3", steps=2)
|
|
assert r["success"] is True
|
|
assert r["output_die"] == "d5"
|
|
|
|
|
|
def test_unknown_tool():
|
|
r = run("nonexistent")
|
|
assert r["success"] is False
|
|
assert "sconosciuto" in r["message"]
|
|
|
|
|
|
def test_ability_check():
|
|
_, char_id = _setup_char()
|
|
r = run("ability_check", character_id=char_id, dc=12, modifier=2)
|
|
assert r["success"] is True
|
|
assert "d20" in r["message"]
|
|
|
|
|
|
def test_saving_throw():
|
|
_, char_id = _setup_char()
|
|
r = run("saving_throw", character_id=char_id, save_type="Tempra", dc=15)
|
|
assert r["success"] is True
|
|
assert r["save_type"] == "Tempra"
|
|
|
|
|
|
def test_saving_throw_invalid_type():
|
|
_, char_id = _setup_char()
|
|
r = run("saving_throw", character_id=char_id, save_type="Forza", dc=15)
|
|
assert r["success"] is False
|
|
|
|
|
|
def test_movement():
|
|
r = run("movement", distance_m=30, terrain="normale")
|
|
assert r["success"] is True
|
|
assert r["rounds"] == 3
|
|
assert r["speed_m_per_round"] == 12
|
|
|
|
|
|
def test_movement_difficult():
|
|
r = run("movement", distance_m=30, terrain="difficile")
|
|
assert r["success"] is True
|
|
assert r["rounds"] == 5
|
|
|
|
|
|
def test_spellcasting():
|
|
_, char_id = _setup_char()
|
|
r = run("spellcasting", character_id=char_id, spell_name="Dardo Incantato", spell_check=18, dc=12)
|
|
assert r["success"] is True
|
|
assert r["result_tier"] in ("minore", "moderato", "maggiore")
|
|
|
|
|
|
def test_spellcasting_failure():
|
|
_, char_id = _setup_char()
|
|
r = run("spellcasting", character_id=char_id, spell_name="Dardo Incantato", spell_check=5, dc=12)
|
|
assert r["success"] is True
|
|
assert "fallisce" in r["message"]
|
|
|
|
|
|
def test_update_inventory():
|
|
_, char_id = _setup_char()
|
|
r = run("update_inventory", character_id=char_id, item="Pozione di Cura")
|
|
assert r["success"] is True
|
|
assert "Pozione di Cura" in r["message"]
|
|
|
|
|
|
def test_award_xp():
|
|
_, char_id = _setup_char()
|
|
r = run("award_xp", character_id=char_id, xp=5)
|
|
assert r["success"] is True
|
|
assert r["xp_gained"] == 5
|
|
|
|
|
|
def test_award_xp_levelup():
|
|
camp_id, _ = _setup_char()
|
|
# Create a lv0 character (contadino) to test level-up
|
|
import src.engine.db as db
|
|
lv0_id = db.create_character(camp_id, "Lv0 Hero", "contadino", "contadino")
|
|
db.update_character(lv0_id, level=0, xp=0)
|
|
r1 = run("award_xp", character_id=lv0_id, xp=10)
|
|
assert r1["xp_total"] == 10
|
|
assert r1["leveled_up"] is True
|
|
|
|
|
|
def test_dm_override():
|
|
r = run("dm_override", command="narrate", params={"text": "Una luce accecante."})
|
|
assert r["success"] is True
|
|
assert r["tool"] == "dm-override"
|
|
|
|
|
|
def test_dm_override_help():
|
|
r = run("dm_override", command="help")
|
|
assert r["success"] is True
|
|
assert "commands" in r
|
|
|
|
|
|
def test_combat():
|
|
_, char_id = _setup_char()
|
|
r = run(
|
|
"combat",
|
|
character_id=char_id,
|
|
target_ac=15,
|
|
attack_bonus=2,
|
|
damage_die="d8",
|
|
mighty_deed_die="d3",
|
|
luck_mod=0,
|
|
armor_type="medium",
|
|
)
|
|
assert r["success"] is True
|
|
assert r["tool"] == "combat"
|
|
assert isinstance(r["hit"], bool)
|