LovecaSim / engine /tests /mechanics /test_unique_ids.py
trioskosmos's picture
Upload folder using huggingface_hub
bb3fbf9 verified
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.