167 lines
5.9 KiB
Python
167 lines
5.9 KiB
Python
from pathlib import Path
|
|
|
|
import pytest
|
|
|
|
from engine.character import Character, ClothingPiece
|
|
from engine.defs import DefRegistry
|
|
from engine.ui import CharacterMenu
|
|
|
|
DEFS_DIR = Path(__file__).resolve().parent.parent / "resources" / "defs"
|
|
|
|
|
|
@pytest.fixture()
|
|
def registry():
|
|
return DefRegistry.load(DEFS_DIR)
|
|
|
|
|
|
def make_human(registry, **kwargs) -> Character:
|
|
return Character(species_id="human", default_body_parts=registry.new_default_body_parts("human"), **kwargs)
|
|
|
|
|
|
def test_defaults_to_the_bio_tab():
|
|
menu = CharacterMenu()
|
|
assert menu.active_tab == "bio"
|
|
|
|
|
|
def test_select_tab_switches_to_equipment():
|
|
menu = CharacterMenu()
|
|
menu.select_tab("equipment")
|
|
assert menu.active_tab == "equipment"
|
|
|
|
|
|
def test_select_tab_ignores_unknown_tab_names():
|
|
menu = CharacterMenu()
|
|
menu.select_tab("inventory") # not a real tab
|
|
assert menu.active_tab == "bio"
|
|
|
|
|
|
def test_cycle_tab_advances_through_every_tab_in_order():
|
|
menu = CharacterMenu()
|
|
seen = [menu.active_tab]
|
|
for _ in range(len(CharacterMenu.TABS)):
|
|
menu.cycle_tab()
|
|
seen.append(menu.active_tab)
|
|
assert seen == ["bio", "equipment", "medical", "bio"]
|
|
|
|
|
|
def test_cycle_tab_closes_any_open_backpack_popup(registry):
|
|
menu = CharacterMenu()
|
|
character = make_human(registry, clothing=[ClothingPiece("back", "backpack_basic")])
|
|
menu.select_tab("equipment")
|
|
menu.right_click_equipment_slot("back", character, registry)
|
|
assert menu.open_backpack_slot == "back"
|
|
menu.cycle_tab()
|
|
assert menu.open_backpack_slot is None
|
|
|
|
|
|
def test_switching_tabs_closes_any_open_backpack_popup(registry):
|
|
menu = CharacterMenu()
|
|
character = make_human(registry, clothing=[ClothingPiece("back", "backpack_basic")])
|
|
menu.right_click_equipment_slot("back", character, registry)
|
|
assert menu.open_backpack_slot == "back"
|
|
menu.select_tab("bio")
|
|
assert menu.open_backpack_slot is None
|
|
|
|
|
|
def test_right_click_backpack_opens_popup(registry):
|
|
menu = CharacterMenu()
|
|
character = make_human(registry, clothing=[ClothingPiece("back", "backpack_basic")])
|
|
opened = menu.right_click_equipment_slot("back", character, registry)
|
|
assert opened is True
|
|
assert menu.open_backpack_slot == "back"
|
|
|
|
|
|
def test_right_click_same_slot_again_closes_the_popup(registry):
|
|
menu = CharacterMenu()
|
|
character = make_human(registry, clothing=[ClothingPiece("back", "backpack_basic")])
|
|
menu.right_click_equipment_slot("back", character, registry)
|
|
closed = menu.right_click_equipment_slot("back", character, registry)
|
|
assert closed is False
|
|
assert menu.open_backpack_slot is None
|
|
|
|
|
|
def test_right_click_a_different_backpack_slot_switches_the_popup(registry):
|
|
menu = CharacterMenu()
|
|
character = make_human(
|
|
registry,
|
|
clothing=[ClothingPiece("back", "backpack_basic"), ClothingPiece("torso", "leather_jacket")],
|
|
)
|
|
# leather_jacket grants no inventory, so this is really just proving "back" is what opens
|
|
menu.right_click_equipment_slot("back", character, registry)
|
|
assert menu.open_backpack_slot == "back"
|
|
|
|
|
|
def test_right_click_non_inventory_item_does_not_open_a_popup(registry):
|
|
menu = CharacterMenu()
|
|
character = make_human(registry, clothing=[ClothingPiece("torso", "leather_jacket")])
|
|
opened = menu.right_click_equipment_slot("torso", character, registry)
|
|
assert opened is False
|
|
assert menu.open_backpack_slot is None
|
|
|
|
|
|
def test_right_click_empty_slot_is_a_no_op(registry):
|
|
menu = CharacterMenu()
|
|
character = make_human(registry)
|
|
opened = menu.right_click_equipment_slot("torso", character, registry)
|
|
assert opened is False
|
|
assert menu.open_backpack_slot is None
|
|
|
|
|
|
def test_close_backpack_popup_clears_it():
|
|
menu = CharacterMenu(open_backpack_slot="back")
|
|
menu.close_backpack_popup()
|
|
assert menu.open_backpack_slot is None
|
|
|
|
|
|
# --- resolve_open_inventory / toggle_backpack (POCKETS_SLOT + real containers) ----------------
|
|
|
|
|
|
def test_resolve_open_inventory_is_none_when_nothing_is_open(registry):
|
|
menu = CharacterMenu()
|
|
character = make_human(registry)
|
|
assert menu.resolve_open_inventory(character, registry) is None
|
|
|
|
|
|
def test_resolve_open_inventory_returns_the_characters_own_inventory_for_pockets(registry):
|
|
from engine.inventory import Inventory
|
|
|
|
menu = CharacterMenu(open_backpack_slot=CharacterMenu.POCKETS_SLOT)
|
|
character = make_human(registry)
|
|
character.inventory = Inventory(4, 4)
|
|
assert menu.resolve_open_inventory(character, registry) is character.inventory
|
|
|
|
|
|
def test_resolve_open_inventory_returns_a_worn_containers_inventory(registry):
|
|
menu = CharacterMenu(open_backpack_slot="back")
|
|
character = make_human(registry, clothing=[ClothingPiece("back", "backpack_basic")])
|
|
resolved = menu.resolve_open_inventory(character, registry)
|
|
assert resolved is character.get_equipped_inventory("back", registry)
|
|
|
|
|
|
def test_toggle_backpack_opens_and_closes_pockets(registry):
|
|
from engine.inventory import Inventory
|
|
|
|
menu = CharacterMenu()
|
|
character = make_human(registry)
|
|
character.inventory = Inventory(4, 4)
|
|
|
|
assert menu.toggle_backpack(CharacterMenu.POCKETS_SLOT, character, registry) is True
|
|
assert menu.open_backpack_slot == CharacterMenu.POCKETS_SLOT
|
|
|
|
assert menu.toggle_backpack(CharacterMenu.POCKETS_SLOT, character, registry) is False
|
|
assert menu.open_backpack_slot is None
|
|
|
|
|
|
def test_toggle_backpack_is_a_no_op_for_pockets_without_an_inventory(registry):
|
|
menu = CharacterMenu()
|
|
character = make_human(registry)
|
|
assert menu.toggle_backpack(CharacterMenu.POCKETS_SLOT, character, registry) is False
|
|
assert menu.open_backpack_slot is None
|
|
|
|
|
|
def test_toggle_backpack_delegates_to_right_click_for_real_slots(registry):
|
|
menu = CharacterMenu()
|
|
character = make_human(registry, clothing=[ClothingPiece("back", "backpack_basic")])
|
|
assert menu.toggle_backpack("back", character, registry) is True
|
|
assert menu.open_backpack_slot == "back"
|