LovecaSim / engine /tests /cards /test_pr_033.py
trioskosmos's picture
Upload folder using huggingface_hub
bb3fbf9 verified
from engine.game.game_state import initialize_game
def setup_test_state():
state = initialize_game(use_real_data=True)
return state
def test_pr_033_ability_reorder_and_discard():
state = setup_test_state()
p0 = state.players[0]
# Setup deck: [100, 101, 102, 103, ...] (100 is top)
p0.main_deck = [100, 101, 102, 103, 104]
p0.discard = []
# Card 473: PL!S-PR-033-PR
card_id = 473
member = state.member_db[card_id]
ability = member.abilities[0]
# Trigger On Play
state.triggered_abilities.append((0, ability, {"card_id": card_id}))
state._process_rule_checks()
# 1. Triggered effect: LOOK_DECK 3 (Already resolved by _process_rule_checks)
# 2. Triggered effect: LOOK_AND_CHOOSE (Already resolved by _process_rule_checks)
# Step 1 check: LOOK_DECK outcome
assert state.looked_cards == [100, 101, 102]
assert p0.main_deck == [103, 104]
# Step 2 check: LOOK_AND_CHOOSE outcome (Choice pushed)
# Should have a pending choice: SELECT_FROM_LIST (reason: look_and_reorder)
assert len(state.pending_choices) > 0
choice_type, params = state.pending_choices[0]
assert choice_type == "SELECT_FROM_LIST"
assert params["reason"] == "look_and_reorder"
assert params["cards"] == [100, 101, 102]
# Action 600: Select 100
state._handle_choice(600)
# Since any_number is True, it should stay in SELECT_FROM_LIST for more choices
assert len(state.pending_choices) > 0
choice_type, params = state.pending_choices[0]
assert choice_type == "SELECT_FROM_LIST"
assert params["cards"] == [101, 102]
assert state._reorder_staged_cards == [100]
# Action 601: Select 102 (skipping 101)
state._handle_choice(601)
assert len(state.pending_choices) > 0
choice_type, params = state.pending_choices[0]
assert params["cards"] == [101] # Only 101 remains
assert state._reorder_staged_cards == [100, 102]
# Action 0: Pass (Finish selecting)
state._handle_choice(0)
# Now it should have transitioned to SELECT_ORDER for [100, 102]
# AND 101 should be in discard
assert 101 in p0.discard
assert state.looked_cards == [] # Cleaned up
assert len(state.pending_choices) > 0
choice_type, params = state.pending_choices[0]
assert choice_type == "SELECT_ORDER"
assert params["cards"] == [100, 102]
# Select order: 102, then 100 (Top to Bottom)
# Action 700: Pick 102 first (idx 1 in cards)
state._handle_choice(701)
# Action 700: Pick 100 second (idx 0 in cards)
state._handle_choice(700)
# Final check: Deck top should be [102, 100, 103, 104]
assert p0.main_deck == [102, 100, 103, 104]
def test_pr_033_ability_discard_all():
state = setup_test_state()
p0 = state.players[0]
p0.main_deck = [100, 101, 102, 103, 104]
p0.discard = []
card_id = 473
ability = state.member_db[card_id].abilities[0]
state.triggered_abilities.append((0, ability, {"card_id": card_id}))
state._process_rule_checks()
# Action 0: Pass immediately (Discard all 3)
state._handle_choice(0)
assert len(p0.main_deck) == 2
assert p0.main_deck == [103, 104]
assert set(p0.discard) == {100, 101, 102}
assert len(state.pending_choices) == 0
def test_pr_033_ability_choose_all_no_reorder_needed():
state = setup_test_state()
p0 = state.players[0]
p0.main_deck = [100, 101, 102, 103]
ability = state.member_db[473].abilities[0]
state.triggered_abilities.append((0, ability, {"card_id": 473}))
state._process_rule_checks()
# Select all 3 in original order
state._handle_choice(600) # 100
state._handle_choice(600) # 101 (idx 0 after shift)
state._handle_choice(600) # 102 (idx 0 after shift)
# Pass choice (though cards empty, code handles it)
# state._handle_choice(0) # Code should auto-trigger reorder if empty.
# Actually, in my implementation:
# if any_number and cards: self.pending_choices.insert(0, ...)
# If cards is empty, it continues below.
# It should be in SELECT_ORDER now
assert state.pending_choices[0][0] == "SELECT_ORDER"
assert state.pending_choices[0][1]["cards"] == [100, 101, 102]
# Confirm order: 100, 101, 102
state._handle_choice(700)
state._handle_choice(700)
state._handle_choice(700)
assert p0.main_deck == [100, 101, 102, 103]