from collections import defaultdict from pathlib import Path import pytest from engine.character import Character from engine.character_creator import CharacterCreator from engine.controls_menu import ControlsMenu from engine.defs import DefRegistry from engine.game_modes import CharacterCreationFlow, MainMenu, PauseMenu from engine.render import menu_draw from engine.ui import AbilityBar, AbilityBarSlot, CharacterMenu from engine.world_creation import WorldCreationMenu DEFS_DIR = Path(__file__).resolve().parent.parent / "resources" / "defs" @pytest.fixture() def registry(): return DefRegistry.load(DEFS_DIR) def new_buckets(): return defaultdict(list) def test_draw_main_menu_emits_a_background_panel_and_option_text(): buckets = new_buckets() menu_draw.draw_main_menu(buckets, MainMenu(has_existing_save=True), 800, 600) assert buckets["ui/panel/background.png"] assert any(k.startswith("ui/font/") for k in buckets) def test_draw_pause_menu_emits_content(): buckets = new_buckets() menu_draw.draw_pause_menu(buckets, PauseMenu(), 800, 600) assert buckets["ui/panel/background.png"] def test_draw_character_creation_species_step(registry): buckets = new_buckets() flow = CharacterCreationFlow(CharacterCreator(registry)) menu_draw.draw_character_creation(buckets, flow, 800, 600) assert buckets["ui/panel/background.png"] def test_draw_character_creation_name_step(registry): buckets = new_buckets() flow = CharacterCreationFlow(CharacterCreator(registry)) flow.advance() flow.type_char("V") menu_draw.draw_character_creation(buckets, flow, 800, 600) assert buckets["ui/panel/background.png"] def test_draw_world_creation_lists_templates_and_highlights_selection(): buckets = new_buckets() menu = WorldCreationMenu() menu.select(0) menu_draw.draw_world_creation(buckets, menu, 800, 600) assert buckets["ui/panel/background.png"] assert buckets["ui/panel/highlight.png"] assert any(k.startswith("ui/font/") for k in buckets) def test_draw_world_creation_with_nothing_selected_defaults_to_first_row(): buckets = new_buckets() menu_draw.draw_world_creation(buckets, WorldCreationMenu(), 800, 600) assert buckets["ui/panel/highlight.png"] def test_draw_controls_menu_highlights_selected_row(): buckets = new_buckets() from engine.config import KeyBindings menu = ControlsMenu(KeyBindings.load(Path("/nonexistent"))) menu_draw.draw_controls_menu(buckets, menu, 800, 600) assert buckets["ui/panel/highlight.png"] def test_draw_ability_bar_highlights_the_selected_slot(): buckets = new_buckets() bar = AbilityBar() bar.assign(2, AbilityBarSlot(kind="hand", source_id="right_hand", ability_id="time_warp_sphere")) bar.select(2) menu_draw.draw_ability_bar(buckets, bar, 600) assert buckets["ui/panel/highlight.png"] assert buckets["ui/panel/border.png"] assert any(k.startswith("ui/font/") for k in buckets) def test_draw_ability_bar_with_nothing_selected_has_no_highlight(): buckets = new_buckets() menu_draw.draw_ability_bar(buckets, AbilityBar(), 600) assert "ui/panel/highlight.png" not in buckets assert buckets["ui/panel/border.png"] def test_draw_character_card_bio_tab(registry): buckets = new_buckets() character = Character( name="Vex", species_id="human", default_body_parts=registry.new_default_body_parts("human") ) menu_draw.draw_character_card(buckets, character, CharacterMenu(), registry, 600) assert buckets["ui/panel/background.png"] assert any(k.startswith("ui/font/") for k in buckets) def test_draw_character_card_equipment_tab(registry): buckets = new_buckets() character = Character( name="Vex", species_id="human", default_body_parts=registry.new_default_body_parts("human") ) card_menu = CharacterMenu() card_menu.select_tab("equipment") menu_draw.draw_character_card(buckets, character, card_menu, registry, 600) assert buckets["ui/panel/background.png"] def test_draw_character_card_medical_tab_lists_body_parts_and_organs(registry): buckets = new_buckets() character = Character( name="Vex", species_id="human", default_body_parts=registry.new_default_body_parts("human") ) card_menu = CharacterMenu() card_menu.select_tab("medical") menu_draw.draw_character_card(buckets, character, card_menu, registry, 600) assert buckets["ui/panel/background.png"] assert any(k.startswith("ui/font/") for k in buckets) def test_draw_character_card_medical_tab_shows_removed_parts_and_ailments(registry): from engine.character import Ailment buckets = new_buckets() character = Character( name="Vex", species_id="human", default_body_parts=registry.new_default_body_parts("human") ) torso = character.get_or_create_body_part_override("torso") torso.ailments.append(Ailment(id="infection", name="Infection", severity=0.5)) leg = character.get_or_create_body_part_override("left_leg") leg.removed = True card_menu = CharacterMenu() card_menu.select_tab("medical") menu_draw.draw_character_card(buckets, character, card_menu, registry, 600) assert buckets["ui/panel/background.png"]