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_update_quest_tool(): camp_id, _ = _setup_char() import src.engine.db as db qid = db.add_quest(camp_id, "Missione Test", "Descrizione test") r = run("update_quest", quest_id=qid, status="completed") assert r["success"] is True assert r["status"] == "completed" assert "Missione Test" in r["message"] def test_update_quest_invalid_status(): camp_id, _ = _setup_char() import src.engine.db as db qid = db.add_quest(camp_id, "Missione", "") r = run("update_quest", quest_id=qid, status="impossibile") assert r["success"] is False def test_update_quest_not_found(): r = run("update_quest", quest_id=99999, status="completed") assert r["success"] is False assert "non trovata" in r["message"] def test_update_quest_with_name(): camp_id, _ = _setup_char() import src.engine.db as db qid = db.add_quest(camp_id, "Vecchio Nome", "") r = run("update_quest", quest_id=qid, status="active", name="Nuovo Nome") assert r["success"] is True assert "Nuovo Nome" in r["name"] 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)