import numpy as np from engine.game.player_state import PlayerState from engine.game.state_utils import MaskedDB, create_uid, get_base_id from engine.models.card import MemberCard def create_dummy_member(cid, name): return MemberCard( card_id=cid, card_no=f"M-{cid}", name=name, cost=1, blades=1, hearts=np.zeros(7, dtype=np.int32), blade_hearts=np.zeros(7, dtype=np.int32), ) def test_masked_db(): base_data = { 101: create_dummy_member(101, "Test Card"), 202: create_dummy_member(202, "Other Card"), } db = MaskedDB(base_data) # Test Base ID lookup assert db[101].name == "Test Card" # Test UID lookup (Instance 1) uid1 = create_uid(101, 1) assert uid1 != 101 assert get_base_id(uid1) == 101 assert db[uid1].name == "Test Card" # Test UID lookup (Instance 5) uid5 = create_uid(101, 5) assert db[uid5].name == "Test Card" # Test Contains assert 101 in db assert uid1 in db assert 999 not in db def test_create_uid_structure(): base = 289 index = 3 uid = create_uid(base, index) # Standard mask check assert (uid & 0xFFFFF) == base assert (uid >> 20) == index def test_deck_logic_simulation(): """Simulate what server.py does and ensure simple dict lookups work if using MaskedDB""" # Simulate DB member_db_data = {289: create_dummy_member(289, "Kasumi")} # Wrap it masked_db = MaskedDB(member_db_data) # Create deck with duplicates deck = [] base_id = 289 for i in range(4): deck.append(create_uid(base_id, i)) assert len(deck) == 4 assert len(set(deck)) == 4 # All unique integers # Verify lookup for uid in deck: assert masked_db[uid].name == "Kasumi" def test_player_score_logic(): """Verify score is based on COUNT of successful lives, not the 'score' attribute on the card.""" p = PlayerState(0) # Assume 3 lives with score=4 each # In the real game, success_lives stores the live IDs p.success_lives = [101, 102, 103] # The logic should be strictly the count assert p.score == 3 # Add one more p.success_lives.append(104) assert p.score == 4 # Ensure it doesn't try to look up DB (which would crash here as DB not provided) # If logic summed 'score' from DB, this access would require a DB. # Since it only checks len(), it works.