Spaces:
Running
Running
| 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. | |