File size: 2,548 Bytes
bb3fbf9
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
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.